tag:blogger.com,1999:blog-23664201354352189332009-07-02T13:14:47.003-07:00Zementis Predictive Analytics<b> Knowledge Base for ADAPA and PMML</b>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.comBlogger73125tag:blogger.com,1999:blog-2366420135435218933.post-75639646796026679792009-07-02T12:50:00.000-07:002009-07-02T13:14:47.026-07:00I got an error uploading a Neural Network model in ADAPA generated in Clementine. Can you help?SPSS <a href="http://knol.google.com/k/alex-guazzelli/pmml-list-of-consumers-and-producers/3pz0mz6zvkz16/2#">PASW tools export all kinds of models in PMML</a>. These are usually perfect and ready for being deployed in ADAPA.<br /><br />We have noticed however that the latest version of Clementine (PASW Modeler) exports Neural Network models in PMML with a small inconsistency which may cause ADAPA to generate an error during model uploading.<br /><br />If you have defined any of your continuous input variables as integer, Clementine will define them correctly in the DataDictionary in the PMML file as integer. See below:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/Sk0RFf6LEQI/AAAAAAAAARY/Nrq3qcS06B0/s1600-h/Picture+2.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 95px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/Sk0RFf6LEQI/AAAAAAAAARY/Nrq3qcS06B0/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5353954318175899906" border="0" /></a>However, in the MiningSchema, Clementine assigns such variables real numbers. See below:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/Sk0RmYKORjI/AAAAAAAAARg/T6rBbA9ct8o/s1600-h/Picture+3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 95px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/Sk0RmYKORjI/AAAAAAAAARg/T6rBbA9ct8o/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5353954883031418418" border="0" /></a>Note that in this case missing value replacement for variable "Age" is 44.5, not an integer.<br /><br />In such cases, ADAPA will throw an error since a real number is being assigned to a variable of type integer.<br /><br />To avoid this problem, the solution is to define any integer continuous variables in the DataDictionary as double. See new DataDictionary below:<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/Sk0ScYX3i-I/AAAAAAAAARo/pHXfDQZdMu8/s1600-h/Picture+4.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 94px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/Sk0ScYX3i-I/AAAAAAAAARo/pHXfDQZdMu8/s400/Picture+4.png" alt="" id="BLOGGER_PHOTO_ID_5353955810801585122" border="0" /></a><br />We plan to add this correction to the PMML converter tool so that it will automatically do the replacement. Note that in this case, the converter is acting as a corrector since you will be passing a PMML file in version 3.2 through it and getting a corrected version 3.2 file back.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-7563964679602667979?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-6571638045034745162009-06-22T16:21:00.000-07:002009-06-22T18:08:54.253-07:00Examining PMML 4.0 - Part I: Pre-ProcessingYou may be wondering what is all the fuss around PMML and its latest 4.0 version. So, we decided to explore all that PMML 4.0 has to offer in a series of blogs. In part I, we will be exploring its improved pre-processing capabilities.<br /><br />All data mining models manipulate the raw data in a way or another before passing it through a a neural network, support vector machine, or regression model. Therefore, a language that wants to represent all the computations that go into a model needs also to be able to represent the data transformations that were applied to the raw data before scoring takes place. PMML is this language! It is the Yin and Yang of data mining.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SkATmR2uo_I/AAAAAAAAAQo/rnchASK6NGE/s1600-h/pmmldatamodels.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 336px; height: 345px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SkATmR2uo_I/AAAAAAAAAQo/rnchASK6NGE/s400/pmmldatamodels.jpg" alt="" id="BLOGGER_PHOTO_ID_5350297905665057778" border="0" /></a>Let's first re-cap on the pre-processing capabilities available in PMML 3.2. This version of PMML allows for the following out of the box data transformations:<br /><ul><li><span style="font-weight: bold;">Normalization of continuous variables</span>: this is accomplished via the <span style="font-style: italic;">NormContinuous</span> element of PMML. It is mostly used to normalized a variable between 0 and 1. See example below (real PMML code) in which two variables are normalized. The first between 0 and 1 and the second between 0 and 4.</li></ul><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAYbRKIsAI/AAAAAAAAAQw/kUZAW2Ultd8/s1600-h/Fig_NormContinuous.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 163px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAYbRKIsAI/AAAAAAAAAQw/kUZAW2Ultd8/s400/Fig_NormContinuous.jpg" alt="" id="BLOGGER_PHOTO_ID_5350303214057598978" border="0" /></a><ul><li><span style="font-weight: bold;">Normalizing Categorical Inputs</span>: normally used to transform strings into numerical variables. This is accomplished by the element <span style="font-style: italic;">NormDiscrete</span>. In the PMML example below, a categorical variable creates dummy variables that will be assigned values 1 or 0 depending on the category assumed by the input variable.</li></ul><ul><li><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAZnGmNA6I/AAAAAAAAAQ4/ob1q4yi5Jgo/s1600-h/Fig_NormDiscrete.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 136px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAZnGmNA6I/AAAAAAAAAQ4/ob1q4yi5Jgo/s400/Fig_NormDiscrete.jpg" alt="" id="BLOGGER_PHOTO_ID_5350304516892591010" border="0" /></a><span style="font-weight: bold;">Discretization</span>: this is used to transform continuous variables into strings. This is accomplished by the <span style="font-style: italic;">Discretize</span> element. In the PMML example below, if the input variable is equal to 500, it is transformed to low; if equal to 5000, it is transformed to medium; and if 50,000, it is high.</li></ul><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAb5bKMzjI/AAAAAAAAARA/m5pJ6IhljXc/s1600-h/Fig_Discretize.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 162px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SkAb5bKMzjI/AAAAAAAAARA/m5pJ6IhljXc/s400/Fig_Discretize.jpg" alt="" id="BLOGGER_PHOTO_ID_5350307030673182258" border="0" /></a><ul><li><span style="font-weight: bold;">Value Mapping</span>: this is accomplished in PMML by the use of a mapping table and the element <span style="font-style: italic;">MapValues</span>. To make things more interesting, in the PMML example below, we combine elements <span style="font-style: italic;">MapValues</span> and <span style="font-style: italic;">NormDiscrete</span> to group small sets of categorical values. In specific, we want to find out if the input variable belongs to a specific group of colors. We do that by using <span style="font-style: italic;">MapValues</span> to map different colors to the same number. We then use the element <span style="font-style: italic;">NormDiscrete</span> to create dummy variables which are used to indicate group membership.</li></ul><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SkAgMm1dEdI/AAAAAAAAARI/wNFzDYlcX2s/s1600-h/Fig_InLineTable.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 288px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SkAgMm1dEdI/AAAAAAAAARI/wNFzDYlcX2s/s400/Fig_InLineTable.jpg" alt="" id="BLOGGER_PHOTO_ID_5350311758271418834" border="0" /></a><ul><li><span style="font-weight: bold;">Arithmetic Expressions</span>: PMML offers a range of arithmetic functions (as well as string and date/time maniputation functions) that can be arranged in different ways to express complex arithmetic expressions. The example below solves the following operation:<br /></li></ul><div style="text-align: center;"><span style="font-style: italic;">ResultVar=maximum(round(InputVar1/3.3),2^(1+log(1.3*InputVar2+1)))<br /><br /></span><div style="text-align: left;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SkAhP277dfI/AAAAAAAAARQ/BKIDhlF1UO4/s1600-h/Fig_Arithmetic.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 248px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SkAhP277dfI/AAAAAAAAARQ/BKIDhlF1UO4/s400/Fig_Arithmetic.jpg" alt="" id="BLOGGER_PHOTO_ID_5350312913644778994" border="0" /></a></div></div> <ul><li><span style="font-weight: bold;">PMML 4.0 - Boolean Operations</span>: Not only PMML 4.0 allows for Boolean operations to be fully expressed, but it also allows these to be nested into IF-THEN-ELSE logic. These new buit-in functions offer a vast new array of possibilites for representing data transformations in PMML. So, we devote the rest of this review by looking at transformations that can now be easily expressed in PMML 4.0.<br /></li></ul>We start with the PMML code below which implements the following logical and arithmetic operations:<span style="font-size:85%;"><br /><span style="font-family:courier new;">IF InputVar1 == "Partner"</span><span style="font-family:courier new;"> THEN</span><span style="font-family:courier new;"> DerivedVar1 = "P"</span><span style="font-family:courier new;"> ELSE</span><span style="font-family:courier new;"> DerivedVar2 = 2 * InputVar2</span></span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsTBpf_lSI/AAAAAAAAALA/fqpVYVkUKlw/s1600-h/Fig_Logical1.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 240px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsTBpf_lSI/AAAAAAAAALA/fqpVYVkUKlw/s400/Fig_Logical1.bmp" alt="" id="BLOGGER_PHOTO_ID_5303853905199732002" border="0" /></a><br />Note that it uses the newly defined 4.0 functions: "if", "equal", and "not" as well as function "*".<br /><br />The PMML code below assumes that both "then" and "else" parts of the "if" use the same derived variable to implement the following operations:<br /><span style="font-size:85%;"><span style="font-family:courier new;">IF InputVar1 == "Partner"</span><span style="font-family:courier new;"> THEN</span><span style="font-family:courier new;"> DerivedVar1 = "5.1 * InputVar2"</span><span style="font-family:courier new;"> ELSE</span><span style="font-family:courier new;"> DerivedVar1 = "InputVar2 / 3.3"</span></span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsTI0JA3eI/AAAAAAAAALI/QWA-zBNxgZM/s1600-h/Fig_Logical2.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 190px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsTI0JA3eI/AAAAAAAAALI/QWA-zBNxgZM/s400/Fig_Logical2.bmp" alt="" id="BLOGGER_PHOTO_ID_5303854028315221474" border="0" /></a>Finally, we end our list of PMML pre-processing examples by showing the use of 4.0 functions "isMissing" and "isIn" combined with function "if". The PMML example below <xref linkend="setOperatorfig"> implements the following operations:<br /><span style=";font-family:courier new;font-size:85%;" >IF InputVar is missing THEN DerivedVar = 1 ELSE (IF InputVar is in ("Partner", "Associate", "Colleague") THEN DerivedVar = 2 ELSE DerivedVar = 3)</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsTc35BymI/AAAAAAAAALY/cheshrni63s/s1600-h/Fig_ArrayMembership.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 188px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsTc35BymI/AAAAAAAAALY/cheshrni63s/s400/Fig_ArrayMembership.bmp" alt="" id="BLOGGER_PHOTO_ID_5303854372919298658" border="0" /></a></xref><br />We finish part I of our PMML tour hoping that this short description of its pre-processing capabilities can help you to easily navigate through all the data transformations now available in PMML 4.0.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-657163804503474516?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-54807602310186145472009-06-16T10:32:00.000-07:002009-06-18T09:44:04.219-07:00PMML 4.0 is here!The <a href="http://www.dmg.org/">DMG (Data Mining Group)</a> has just released <a href="http://www.dmg.org/pmml-v4-0.html">PMML 4.0</a>, the latest and greatest version of the Predictive Model Markup Language.<br /><br /><div style="text-align: left;"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/Sjf2Te-LweI/AAAAAAAAAQQ/Z3SUVN7PM2o/s1600-h/Picture+1.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 148px; height: 49px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/Sjf2Te-LweI/AAAAAAAAAQQ/Z3SUVN7PM2o/s400/Picture+1.png" alt="DMG, PMML" id="BLOGGER_PHOTO_ID_5348013897117581794" border="0" /></a><br /></div><span style="font-size:100%;">Zementis, together with SPSS, SAS, IBM, Open Data Group, Salford Systems, Microstrategy and all the other contributing members of the DMG is proud to be part of the making of PMML, the <span style="font-style: italic;">de facto</span> standard to represent data mining models.<br /><br />Not only can </span><span style="font-size:100%;">PMML </span><span style="font-size:100%;">represent a wide range of statistical techniques, but it can also be used to represent the data transformations necessary to transform raw data into meaningful feature detectors. In this way, PMML offers a standard to represent data manipulation and modeling in a single concise way.</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/SjfZ1OYFZ8I/AAAAAAAAAQI/HVHTnc4Frf8/s1600-h/pmmldatamodels.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 336px; height: 345px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SjfZ1OYFZ8I/AAAAAAAAAQI/HVHTnc4Frf8/s400/pmmldatamodels.jpg" alt="" id="BLOGGER_PHOTO_ID_5347982590941161410" border="0" /></a><br /><span style="font-size:130%;"><br /></span><span style="font-weight: bold;font-size:130%;" >Improved Pre-Processing Capabilities</span><br /><br />PMML 4.0 extends the range of pre-processing capabilities supported by older versions by adding a range of boolean operations (e.g., and, or, not, equal, notEqual, greaterOrEqual, ...) to the list of built-in functions. These, combined with an IF-THEN-ELSE function which is also new to PMML, allow for the representation of a wide range of feature detectors.<br /><br />For examples on how to use these new pre-processing capabilities as well as all the standard PMML transformations, please check the<a href="http://www.predictive-analytics.info/2009/04/pmml-data-pre-processing-primer.html"> PMML Data Pre-Processing Primer</a>.<br /><span style="font-weight: bold;"><br /><span style="font-size:130%;">Time Series Models</span></span><br /><br />PMML 4.0 also extends the existing standard by allowing for the representation of Time Series Models. In particular, it allows for data miners and data mining tools to represent Exponential Smoothing models and offers place holders for ARIMA, Seasonal Trend Decomposition, and Spectral Analysis which are to be supported in the near future.<br /><span style="font-weight: bold;"><br /><span style="font-size:130%;">Model Explanation</span><br /></span><br />Other additions are Model Explanation and Multiple Models. Model Explanation allows for evaluation and model performance measures to be part of the PMML file itself. In this way, not only data manipulation and models get to be defined, but also associated ROC Graph, Gains/Lift Charts, Confusion Matrix, Field Correlations, Univariate Statistics, and more.<br /><br /><span style="font-weight: bold;font-size:130%;" >Multiple Models</span><br /><br />Multiple Models allows for model composition, ensembles, and segmentation. It replaces the old Model Composition element to offer greater flexibility for combining different models types, such as regression and decision trees.<br /><br /><span style="font-weight: bold;font-size:130%;" >Extending Existing Elements</span><br /><br />Last, but not least, PMML 4.0 offers a range of extensions to existing elements, such as the addition of multi-class classification for Support Vector Machines, improved representation for Association Rules, and the addition of Cox Regression Models.<br /><br />There is no doubt that PMML is here to stay. The announcement of PMML 4.0 attests to the commitment of the leading data mining vendors to be able to represent their solutions through a single language, a language that can be understood by all. It is our vision that users will be free to share models among many solutions, benefiting from an environment in which interoperability is truly attainable.<br /><br />For more information on PMML and a list of useful links, please check <a href="http://www.predictive-analytics.info/2009/04/pmml-101.html">PMML 101</a>. Also, check the article "<a href="http://journal.r-project.org/2009-1/RJournal_2009-1_Guazzelli+et+al.pdf">PMML: An Open Standard for Sharing Models</a>" just published in The R Journal.<br /><br />We also invite the entire community to join our on-going PMML discussion at the <a href="http://www.analyticbridge.com/group/pmml">AnalyticBridge website</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-5480760231018614547?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-41265875809702125322009-06-05T17:05:00.001-07:002009-06-05T17:22:26.701-07:00My PMML KXEN exported model has problems, how do I fix it?The latest KXEN software exports perfect PMML, however if you are using older versions of KXEN, the PMML model it exports may have some problems which will be picked-up by the PMML Converter during conversion or ADAPA during model upload. These hic-ups can be easily fixed. Here is a list of issues we encountered (and remedies we suggest).<br /><br />1) Your PMML model needs to contain the URL with the address of the PMML schema. Our PMML Converter will add that to the model automatically once you pass it through the converter.<br /><br />2) Models may contain DerivedFields for which optype = "continuous" but dataType = "string". Just change the dataType to "double".<br /><br />3) Models may contain DerivedFields in which the output of a NormContinuous transformation is a float (dataType = "float"). Change the dataType to "double".<br /><br />4) For clustering models, make sure compareFunction = "absdiff" is expressed with a small "d". Models may refer to "absDiff" instead which is not valid.<br /><br />5) Again, for clustering models only, delete the element CenterFields (this is not valid PMML).<br /><br />6) If you have a Mining Model, also check our blog on <a href="http://adapasupport.zementis.com/2009/06/how-to-execute-pmml-mining-models.html">how to upload KXEN Mining Models into ADAPA.</a><br /><br />Your model should be perfect now and ready for uploading into ADAPA.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-4126587580970212532?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-18324280355253251682009-06-04T16:45:00.000-07:002009-06-05T17:19:42.246-07:00How to execute PMML Mining Models exported by KXEN in ADAPA?KXEN exports PMML models. These can be readily uploaded into ADAPA (regression and clustering models) for execution.<br /><br />The latest KXEN software exports perfect PMML models. However, if you are using an older version of KXEN, you may want to use the PMML Converter to diagnose the health of your model before attempting upload into ADAPA. <a href="http://adapasupport.zementis.com/2009/06/my-pmml-kxen-exported-mode-has-problems.html">Existing hic-ups can be easily resolved</a>.<br /><br />In this blog we will focus on how to score Mining Models in ADAPA. These are KXEN regression models that output a probability. They are represented in PMML by a MiningModel element which is not currently supported by ADAPA.<br /><br />First, you need to verify that your Mining Model contains two regression tables. The goal here is to create two PMML files out of the file exported by KXEN. Once the two files are created, they can be easily uploaded into ADAPA. Scoring becomes sequential. You will first pass data through the first model and use its output as input to the second model.<br /><br />For the first model, delete the LocalTransformations element (containing the normalization of variable "intermediate_value") as well as the second regression table (for which the only NumericPredictor is named "kxen_post_processing". Also, rename your predicted variable in the DataDictionary and MiningSchema elements to "intermediate_value". This is the output of the first model.<br /><br />For the second model, create a DataDictionary element with two fields: 1) the "intermediate_value" which is the only input for this model; and 2) the predicted field - for this you can use the name of the predicted variable from the original KXEN export. The example below assumes this to be "rr_color". Then create a regression model containing the LocalTransformations element of the original model together with its second regression table. See example below.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/Sims3lbg-7I/AAAAAAAAAQA/HK35VcOtGmk/s1600-h/Picture+3.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 222px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/Sims3lbg-7I/AAAAAAAAAQA/HK35VcOtGmk/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5343992503792106418" border="0" /></a><br />The two models will work as expected if executed in sequence. In the ADAPA web console, you can score the input data against the first model, obtain its output and use it as input to the second model. You can also automate these tasks by using web-service calls to ADAPA.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-1832428035525325168?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-77938160539055715652009-06-01T15:28:00.000-07:002009-06-02T18:17:51.541-07:00How to Score 300,000,000 Customer Records for $3<div align="justify"></div><div align="justify"></div><div align="justify"></div><div align="justify"><a href="http://3.bp.blogspot.com/_EhWcK1NK0Rg/SiRgzfePOOI/AAAAAAAAAgI/ZvxUlmGxaqs/s1600-h/Adapa.jpg"><img style="MARGIN: 0px 10px 10px 0px; WIDTH: 165px; FLOAT: left; HEIGHT: 140px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5342501495706171618" border="0" alt="" src="http://3.bp.blogspot.com/_EhWcK1NK0Rg/SiRgzfePOOI/AAAAAAAAAgI/ZvxUlmGxaqs/s200/Adapa.jpg" /></a>Cloud computing promises lower cost and higher scalability. Translating this to a real-world practical application for predictive analytics, here is what this means for you in simple facts and numbers. With the <a href="http://www.zementis.com/predictive_analytics_edition.htm"><span id="SPELLING_ERROR_0" class="blsp-spelling-error">Zementis</span> <span id="SPELLING_ERROR_1" class="blsp-spelling-error">ADAPA</span> scoring engine</a> on the Amazon Elastic Compute Cloud, you can <em>score over <strong>300 million (!) records for about $3</strong></em><strong>,</strong> all in less than one hour.<br /><br /></div><div align="justify"></div><div align="justify">Performance and scalability have been key design principles for <span id="SPELLING_ERROR_2" class="blsp-spelling-error">ADAPA</span>, in addition to open standards and Service Oriented Architecture (<span id="SPELLING_ERROR_3" class="blsp-spelling-error">SOA</span>). To illustrate this in a real-world benchmark, we measured the batch scoring performance for different Amazon EC2 instance types. Because computational efforts vary across different model types, we report only the average numbers measured for a collection of ten (10) different predictive models, each based on processing a data file containing 10 million records.</div><br /><div align="left"></div><br /><div align="left"></div><img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 430px; DISPLAY: block; HEIGHT: 270px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5342523694528149058" border="0" alt="" src="http://2.bp.blogspot.com/_EhWcK1NK0Rg/SiR0_oh1NkI/AAAAAAAAAhg/is31NkaXl9k/s400/performance.GIF" /><br /><p align="justify"><em><span style="font-size:85%;">Figure: Average number of records processed per hour for each Amazon EC2 instance type. The average is based on 10 different <span id="SPELLING_ERROR_4" class="blsp-spelling-error">PMML</span> models, with the fastest instance scoring over 300 million records per hour.</span></em><br /></p><br /><div align="justify">We used ten different predictive models, including various regression models, neural network, clustering and decision tree algorithms which were created in several statistical tools and then exported in the <a href="http://adapasupport.zementis.com/2008/02/what-is-pmml-and-how-can-i-learn-more.html">Predictive Model Markup Language (<span id="SPELLING_ERROR_5" class="blsp-spelling-error">PMML</span>) standard</a>. The <span id="SPELLING_ERROR_6" class="blsp-spelling-error">PMML</span> models subsequently were deployed and executed in the <a href="http://www.zementis.com/predictive_analytics_edition.htm"><span id="SPELLING_ERROR_7" class="blsp-spelling-error">ADAPA</span> Predictive Analytics Edition</a> on Amazon EC2.</div><br /><div align="justify">The fastest instance (Amazon type High-CPU XL), <span id="SPELLING_ERROR_8" class="blsp-spelling-error">ADAPA</span> scored on average over 300 million records in one hour. One hour of the High-CPU XL instance costs US$2.49 (two dollars and forty nine cents), plus a few cents for the data transfer; all in all, it adds up to less than $3 for the task.</div><br /><div align="justify">In addition to raw processing performance for scoring data, note that <span id="SPELLING_ERROR_9" class="blsp-spelling-error">ADAPA</span> remarkably accelerates the speed of deployment and integration for predictive analytics. While it is possible to scale processing speed with additional hardware, deployment and integration are the real bottlenecks for projects. Only a framework that leverages open standards for interoperability provides the necessary agility required for proper management and deployment of predictive models.</div><br /><div align="justify">With cloud computing and Software as a Service (<span id="SPELLING_ERROR_10" class="blsp-spelling-error">SaaS</span>), <span id="SPELLING_ERROR_11" class="blsp-spelling-error">ADAPA</span> delivers an unprecedented cost/performance ratio for implementing predictive analytics across the enterprise. <a href="http://www.zementis.com/howtobuy.htm">Sign up for <span id="SPELLING_ERROR_12" class="blsp-spelling-error">ADAPA</span> on Amazon EC2 instantly</a> and start using it in just a few minutes! Starting at $1 per hour for a small instance and no long-term commitment required, experience for yourself what <span id="SPELLING_ERROR_13" class="blsp-spelling-error">ADAPA</span> does for your predictive models without breaking the bank. Use your own models or try <span id="SPELLING_ERROR_14" class="blsp-spelling-error">ADAPA</span> with our <a href="http://www.zementis.com/pmml_examples.htm"><span id="SPELLING_ERROR_15" class="blsp-spelling-error">PMML</span> model examples</a>.</div><div align="justify"></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-7793816053905571565?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-40697539236451847272009-05-28T17:42:00.000-07:002009-06-03T14:13:01.792-07:00The R Journal - A Refereed Journal for the R Project Launches<a href="http://1.bp.blogspot.com/_EhWcK1NK0Rg/Sh8wbSrG7JI/AAAAAAAAAgA/d5H0RYMFHuc/s1600-h/R.bmp"><img style="margin: 0px 10px 10px 0px; width: 101px; float: left; height: 77px;" id="BLOGGER_PHOTO_ID_5341040928511945874" alt="" src="http://1.bp.blogspot.com/_EhWcK1NK0Rg/Sh8wbSrG7JI/AAAAAAAAAgA/d5H0RYMFHuc/s200/R.bmp" border="0" /></a><br /><div><em>The </em><a href="http://www.r-project.org/"><em>R project</em></a><em>, a free software environment for statistical computing and graphics, now features a peer-reviewed journal.</em> </div><br /><div><br />The R newsletter has been transformed into <a href="http://journal.r-project.org/">The R Journal</a>, a refereed journal for articles covering topics that are of interest to users or developers of R. The first issue is now available online. As a sign of the open source R project gaining significant momentum, The R Journal intends to reach a wide audience with high-quality papers that are focused on R.<br /><br />As a supporter of the R PMML Package (see <a href="http://adapasupport.zementis.com/2008/02/how-can-i-export-pmml-code-from-r.html">blog</a> and <a href="http://adapasupport.zementis.com/2008/11/r-to-pmml-export-video-tutorial.html">video tutorial</a>), <a href="http://www.zementis.com/">Zementis</a> (together with <a href="http://www.togaware.com">Togaware</a>) is honored that our article "<a href="http://journal.r-project.org/2009-1/RJournal_2009-1_Guazzelli+et+al.pdf">PMML: An Open Standard for Sharing Models</a>" has been selected by the editorial board to be published as part of the inaugural issue.<br /><br />While our article emphasizes the importance of the <a href="http://adapasupport.zementis.com/2008/02/what-is-pmml-and-how-can-i-learn-more.html">Predictive Model Markup Language</a> (PMML) standard, other contributed research papers address a wide range of topics including graphics and parallel computing. Of more general interest are the invited articles on "The Future of R" which provide the reader with an overview of R's programming model and R-Forge, a central, collaborative platform for the development of R packages.<br /><br />Following the feature in the <a href="http://adapasupport.zementis.com/2009/01/statistical-analysis-and-predictive.html">New York Times</a> in early 2009, this is yet another significant milestone for R. </div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-4069753923645184727?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-33401557089744510702009-05-20T14:18:00.000-07:002009-05-20T14:30:19.852-07:00KDD 2009 Panel on Open Standards and Cloud Computing<strong><em></em></strong><br /><strong><em>Emerging Trends in Open Standards and Cloud Computing for Data Mining.</em><br /></strong><br />Please join us for an exciting panel discussion at the 15<span class="blsp-spelling-error" id="SPELLING_ERROR_0"><span class="blsp-spelling-error" id="SPELLING_ERROR_0">th</span></span> <span class="blsp-spelling-error" id="SPELLING_ERROR_1"><span class="blsp-spelling-error" id="SPELLING_ERROR_1">ACM</span></span> <span class="blsp-spelling-error" id="SPELLING_ERROR_2"><span class="blsp-spelling-error" id="SPELLING_ERROR_2">SIGKDD</span></span> Conference on Knowledge Discovery and Data Mining in Paris.<br /><br />Over the past decade, we have seen tremendous interest in the application of data mining and statistical algorithms, first in research and science and, more recently, across various industries. Impacting scientific and business applications alike, interoperability and open standards still lack broader adoption in the data mining community. In addition, emerging trends in cloud computing and Software as a Service will play a critical role in promoting the effective implementation and widespread application of predictive models.<br /><br />The panel will discuss various topics related to open standards and cloud computing, with a particular focus on the practical use of statistical algorithms, reliable production deployment of models and the integration of predictive analytics within other systems.<br /><br />Moderated by <a href="http://www.zementis.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_3"><span class="blsp-spelling-error" id="SPELLING_ERROR_3">Zementis</span></span></a>, the panel is comprised of a distinguished group of thought leaders representing key software vendors in the data mining industry including <a href="http://www.dmg.org/"><span class="blsp-spelling-error" id="SPELLING_ERROR_4"><span class="blsp-spelling-error" id="SPELLING_ERROR_4">DMG</span></span></a> / <a href="http://www.opendatagroup.com/">Open Data Group</a>, <a href="http://www.ibm.com/">IBM</a>, <a href="http://www.knime.org/"><span class="blsp-spelling-error" id="SPELLING_ERROR_5"><span class="blsp-spelling-error" id="SPELLING_ERROR_5">KNIME</span></span></a>, <a href="http://www.kxen.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_6"><span class="blsp-spelling-error" id="SPELLING_ERROR_6">KXEN</span></span></a>, <a href="http://www.microstrategy.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_7"><span class="blsp-spelling-error" id="SPELLING_ERROR_7">Microstrategy</span></span></a>, <a href="http://www.pervasive.com/">Pervasive</a>, <a href="http://www.sas.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_8"><span class="blsp-spelling-error" id="SPELLING_ERROR_8">SAS</span></span></a> and <a href="http://www.spss.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_9"><span class="blsp-spelling-error" id="SPELLING_ERROR_9">SPSS</span></span></a>.<br /><br />For details, please see the <a href="http://www.sigkdd.org/kdd2009/panels.html"><span class="blsp-spelling-error" id="SPELLING_ERROR_10"><span class="blsp-spelling-error" id="SPELLING_ERROR_10">KDD</span></span> 2009 web site</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-3340155708974451070?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-91933319003336115842009-05-12T16:30:00.000-07:002009-05-12T16:54:20.135-07:00SAP selects Zementis as a winner in the SAP BusinessObjects Explorer Development Contest<div>Recently, SAP sponsored a contest that challenged the developer community to create and demonstrate the most innovative use of SAP <span class="blsp-spelling-error" id="SPELLING_ERROR_0">BusinessObjects</span> Explorer <span class="blsp-spelling-error" id="SPELLING_ERROR_1">APIs</span> inside of another application or process. The challenge was a great success, and SAP received a large number of high-quality submissions.</div><br /><div><br /></div><img id="BLOGGER_PHOTO_ID_5335088878402116178" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 300px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_EhWcK1NK0Rg/SgoLEYJLmlI/AAAAAAAAAfo/0izHWOwJ4LE/s400/SAP+Zementis+ADAPA+Integration+small.GIF" border="0" /><br />In its solution, <span class="blsp-spelling-error" id="SPELLING_ERROR_2">Zementis</span> combined on-demand, high-performance processing for predictive algorithms through the <span class="blsp-spelling-error" id="SPELLING_ERROR_3">ADAPA</span> Predictive Analytics scoring engine on Amazon EC2 with dynamic, on-demand visualization of the results in SAP <span class="blsp-spelling-error" id="SPELLING_ERROR_4">BusinessObjects</span> Explorer. The <span class="blsp-spelling-error" id="SPELLING_ERROR_5">Zementis</span> innovation leverages services deployed in two distinct cloud computing infrastructures, Amazon EC2 and SAP, demonstrating true interoperability between services, platforms, and vendors.<br /><br />We also posted a brief <a href="http://www.zementis.com/videos/Polestar_ADAPA_demo.htm">VIDEO</a> that illustrates the integration between <span class="blsp-spelling-error" id="SPELLING_ERROR_6">ADAPA</span> and the SAP <span class="blsp-spelling-error" id="SPELLING_ERROR_7">BusinessObjects</span> Explorer.<br /><br />(<a href="http://www.sap.com/about/newsroom/sapphire/newsbyte/development-contest-winners.epx">SAP Announcement Details</a>)<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-9193331900333611584?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-34743562795195822372009-04-28T13:25:00.000-07:002009-05-03T13:24:03.578-07:00Scoring data in ADAPA via web services using SQL Server Integration Services (SSIS)Data integration is a big part of putting your predictive models to work. ADAPA allows for easy model deployment, but how can you actually move the data to ADAPA for scoring? One simple way is by using <a href="http://www.microsoft.com/sqlserver/2008/en/us/integration.aspx">SQL Server Integration Services (SSIS)</a> and its Web Service Task.<br /><br /><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/8i6TY2KyC1I&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/8i6TY2KyC1I&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object><br /><br />[<a href="http://www.zementis.com/videos/SSIS_WebServices.htm">High Res Video: SSIS Web Service Task</a>]<br /><br />Microsoft SQL Server 2008 provides a scalable enterprise data integration platform with exceptional Extract, Transform, Load (ETL) and integration capabilities, enabling organizations to more easily manage data from a wide array of data sources. In this blog, we will show you how to score data in ADAPA by using the SSIS Web Service Task.<br /><br />In this blog, you will assume that you already familiar with SQL Server Business Intelligence Development Studio. All figures shown in this blog are snapshots from this tool since it is the SSIS environment used to develop integration services.<br /><br />Once you are able to successfully launch the SQL Server Business Intelligence Development Studio (from noow on referred to in here as SSIS development tool), you should be able to easily create a "New Project" and configure data flow or script tasks to read/write your data (which in SSIS can be from/to a variety of sources/destinations). <br /><br />For this example, we are interested in scoring Iris data against a neural network model which has previously been uploaded in ADAPA (for more information on the Iris dataset and the Iris Neural Network PMML model used here, please visit our <a href="http://www.zementis.com/pmml_examples.htm">Zementis PMML Examples page</a>). <br /><br />The simplest way for us to achieve this is to set-up a "Web Service Task" in SSIS. By selecting this task from the "Control Flow Items" and dragging it into the main editor, the screen should look like the one shown below. Note that we are not depicting any other SSIS tasks for simplicity reasons.<br /><br /><a href="http://3.bp.blogspot.com/_ojiyfepcnKk/SfdqPjgXpeI/AAAAAAAAAPY/4yu3qiE462w/s1600-h/SSIS_Iris_11.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SfdqPjgXpeI/AAAAAAAAAPY/4yu3qiE462w/s400/SSIS_Iris_11.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329845499477861858" /></a><br /><br />By double-clicking on the Web Service Task, the SSIS development tool will prompt us with a dialog box asking for the properties used to configure our task. The dialog box is shown below.<br /><br /><a href="http://2.bp.blogspot.com/_ojiyfepcnKk/SfX0aWo53OI/AAAAAAAAAOo/Em6HQZVAVrw/s1600-h/SSIS_Iris_3.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 337px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SfX0aWo53OI/AAAAAAAAAOo/Em6HQZVAVrw/s400/SSIS_Iris_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329434467653770466" /></a><br /><br />So, let's start by creating a new HTTP connection. Once you select "New Connection" from the drop-down menu, you are faced with a new dialog box.<br /><br /><a href="http://1.bp.blogspot.com/_ojiyfepcnKk/SfX1vSdsaSI/AAAAAAAAAOw/sjMemPnyZt4/s1600-h/SSIS_Iris_4.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SfX1vSdsaSI/AAAAAAAAAOw/sjMemPnyZt4/s400/SSIS_Iris_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329435926821890338" /></a><br /><br />Note that in this figure, we have already provided SSIS with the URL to the ADAPA WSDL file. The WSDL contains a separate operation for each of your PMML models that have been uploaded in ADAPA. In here, we are using an example URL. You can find a link to the correct URL you will need to use in the bottom of the help page of your ADAPA Instance. <br /><br />We have also provided SSIS with the appropriate security information for accessing ADAPA which includes name and password. These are the same as the e-mail and password you used to login into the ADAPA Web Console (where you uploaded your predictive models).<br /><br />Once you are done configuring the connection, click on "Test Connection". If everything goes as expected, SSIS will give you a message saying that the connection was successful. <br /><br />Now, it is time to go back to the original dialog box and finish the configuration of the web service task. For the WSDL file, you will need to give SSIS the location of the file itself. You can first create an empty file and enter that as the WSDL file. Then, set "OverwriteWSDLFile" to true, and click on "Donwload WSDL" on the bottom of the dialog box. The SSIS development tool will download the WSDL into the empty file you created.<br /><br />Given that all "General" properties have been configured, let's move on to "Input". The dialog box shown below already displays our selections. Thanks to the WSDL file, SSIS will automatically add "adapaModelsService" to the drop-down menu. The same for Method. All the models you uploaded in ADAPA are available for selection in the drop-down menu. In this example, we are using the Iris_NN model. Once the method is specified, all input variables available are displayed. In this case, we have four: sepal_length, sepal_width, petal_length, and petal_width. Note that we entered values by hand for each of these variables. In most cases, however, input values will come from a database or file and will be dynamically passed to the web service.<br /><br /><a href="http://3.bp.blogspot.com/_ojiyfepcnKk/Sfd2DNyRSCI/AAAAAAAAAPg/KyQ99WMfaJg/s1600-h/SSIS_Iris_12.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/Sfd2DNyRSCI/AAAAAAAAAPg/KyQ99WMfaJg/s400/SSIS_Iris_12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329858481628465186" /></a><br /><br />Continuing with the configuration of the web service task, let's now move on to "Output". In the dialog box shown below, we selected "OutputType" to be a Variable and configure this variable to be "User::WebServiceResponse" (it is very easy to create new variables in the SSIS development tool). Variable "WebServiceResponse" was created to be of type string. This variable will contain the response ADAPA will send back after it executes the Iris_NN model. <br /><br /><a href="http://4.bp.blogspot.com/_ojiyfepcnKk/Sfd2uNMuyEI/AAAAAAAAAPo/m1jMG9oQoNw/s1600-h/SSIS_Iris_13.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 338px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/Sfd2uNMuyEI/AAAAAAAAAPo/m1jMG9oQoNw/s400/SSIS_Iris_13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329859220205389890" /></a><br /><br />Basically, that's all we need to access ADAPA using SSIS. Once we run our project, we can see the value ADAPA computed by placing a break point on the end of the execution of the web service task. See screen below.<br /><br /><a href="http://1.bp.blogspot.com/_ojiyfepcnKk/Sfd57TSSSaI/AAAAAAAAAPw/MXwii_T0e6U/s1600-h/SSIS_Iris_14.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/Sfd57TSSSaI/AAAAAAAAAPw/MXwii_T0e6U/s400/SSIS_Iris_14.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329862743712483746" /></a><br /><br />Once we do that and execute the task, we can then take a look at the WebServiceResponse variable. Notice that in the screenshot below, the response we got back from ADAPA was "Iris-versicolor" (look for the variable highlighted in blue). <br /><br /><a href="http://4.bp.blogspot.com/_ojiyfepcnKk/Sfd6sZSFSyI/AAAAAAAAAP4/z_h30VHP-r8/s1600-h/SSIS_Iris_15.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/Sfd6sZSFSyI/AAAAAAAAAP4/z_h30VHP-r8/s400/SSIS_Iris_15.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329863587135834914" /></a><br /><br />Accessing ADAPA via the "Web Service Task" is a simple and quick way to integrate your data and models using SSIS. Note, however, that you can choose to use the "Script Task" item to access ADAPA via Web Services. You can also use data flow and script tasks to read/write data from/to a file or database. <br /><br />For more information on how to configure the Web Service Task and use the response you get back from it, please take a look at the <a href="http://msdn.microsoft.com/en-us/library/cc952927.aspx">Web Service Training Video </a>from Microsoft.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-3474356279519582237?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-18929630061874539292009-04-15T15:14:00.000-07:002009-05-03T07:56:55.534-07:00Scoring data in ADAPA via web services using Jitterbit.Data integration is a big part of putting your predictive models to work. ADAPA allows for easy model deployment, but how can you actually move data from, say, your database to ADAPA for scoring? One simple way is by using <a href="http://www.jitterbit.com">Jitterbit</a> and its web service call operation. <br /><br /><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/oyyva-LoPP8&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/oyyva-LoPP8&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object><br /><br />[<a href="http://www.zementis.com/videos/Jitterbit_Database.htm">High Res Video: Jitterbit Database Integration</a>]<br /><br />Jitterbit is the provider of the most popular open source data and application integration platform. In this blog, we will show you how to score data residing on a database in ADAPA as well as write the resulting scores back to the same database.<br /><br />Obviously, you will need first to install and launch the Jitterbit Integration Environment as well as the Jitterbit Server (you can find both available for download in the <a href="http://www.jitterbit.com">Jitterbit website</a>). If using MySQL, as we are in this example, you will also need to install the MySQL ODBC driver in the same computer where you install Jitterbit. You can download the MySQL ODBC driver from <a href="http://www.mysql.com/products/connector/odbc/">here</a>.<br /><br />Before using Jitterbit, we highly recommend that you spend sometime getting acquainted with the tool and what it can do for you. The Jitterbit website contains a series of <a href="http://www.jitterbit.com/Product/integration-webinars.php">informative webinars</a>. We suggest you watch at least three before attempting to work on your own. These are:<br /><ul><br /><li>Jitterbit Overview: Introduction to Open Source Integration</li><br /><li>Using Jitterbit: A First Look</li> <br /><li>Integration: Working with Sources</li><br /></ul><br />Now that you are a Jitterbit expert, make sure your models are uploaded in ADAPA. Once you do that, they will be automatically available for execution via web-services. It is now time to Jitterbit.<br /><br />Once you are able to successfully launch the Jitterbit Integration Server, you should be able to easily create a "New Operation". Just select from the top menu: File->New->Operation. Once you do that, you will see the new operation you created in Jitterbit as shown below.<br /><br /><a href="http://1.bp.blogspot.com/_ojiyfepcnKk/SeZhD9YBQCI/AAAAAAAAAMw/OkjHlF5yeDQ/s1600-h/NewOperation_Jitterbit1.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 294px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SeZhD9YBQCI/AAAAAAAAAMw/OkjHlF5yeDQ/s400/NewOperation_Jitterbit1.png" border="0" alt="Creating a new operation in Jitterbit - Data Integration for Predictive Analytics"id="BLOGGER_PHOTO_ID_5325050330055000098" /></a><br /><br />Now it is time for you to name it. For this example, let's call it IrisScoring since we are interested in scoring Iris data (for more information on the Iris dataset and the Iris Neural Network PMML model used here, please visit our <a href="http://www.zementis.com/pmml_examples.htm">Zementis PMML Examples page</a>). Now, right click anywhere on the new IrisScoring operation box and select from the drop-down menu: Activity->Web Service Call. Once you do that, you will see in Jitterbit that the operation now includes a web service call as shown below.<br /><br /><a href="http://3.bp.blogspot.com/_ojiyfepcnKk/SeZkjsp4USI/AAAAAAAAAM4/sFbYwIdQ1bk/s1600-h/IrisScoring_Jitterbit2.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 241px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SeZkjsp4USI/AAAAAAAAAM4/sFbYwIdQ1bk/s400/IrisScoring_Jitterbit2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325054173857206562" /></a><br /><br />The IrisScoring operation has now all the elements it needs for us to successfully read, score, and write our data from and to a database. Remember that once you upload a model into ADAPA, it is ready to be executed via either the web-console, or web-services. In here, we use web-services to execute the Iris Neural Network model (Iris_NN) and Jitterbit to put the integration puzzle together.<br /><br />Now, it is just a matter of filling out the blanks. For that, let's work together and follow the 3 steps outlined below. <br /><br /><strong>Step 1</strong><br /><br />In this step, we will define the "Source" and the "Target" of our operation. Basically, Source defines where we are getting our data from for building our web service request and Target where we are saving the web service response we get back from ADAPA.<br /><br />Let's start by creating a "New Source". For that, right click on the first block named "Source" of the IrisScoring operation and select from the drop-down menu: "Create New". The screen will now display the form for "New Source". From the drop-down menu for type, select "Database". Notice here that,you can also select to read data from other sources including FTP sites, flat files, etc. Once you select "Database" though, Jitterbit will show all the connection parameters necessary for it to access the database where the Iris data resides. For the driver, if you want to read data from MySQL, select the MySQL ODBC Driver. Enter the server and database names as well as login and password. Jitterbit should now look as shown below.<br /><br /><a href="http://4.bp.blogspot.com/_ojiyfepcnKk/SeZpOgShEvI/AAAAAAAAANA/T2BV41XqjXU/s1600-h/Database.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SeZpOgShEvI/AAAAAAAAANA/T2BV41XqjXU/s400/Database.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5325059307318874866" /></a><br /><br />Now, let's create a "New Target". For that, right click on the last block named "Target" of the IrisScoring operation and select "Create New". In our example, we want to write back the model results to the same MySQL database we read our input data from and so the information we provide to Jitterbit contains the same connection parameters as we did for "New Source". <br /><br /><strong>Step 2</strong><br /><br />Now that we have our new source and target defined, let's focus on the web service call itself. To create a "New WebServiceCall", right click on the middle block named "Web Service Call" of the IrisScoring operation and select "Create New". You will now need to give Jitterbit the URL of the ADAPA WSDL file. The WSDL contains a separate operation for each of your PMML models that have been uploaded in ADAPA. Once Jitterbit is able to access the WSDL, the screen should look like the one below.<br /><br /><a href="http://4.bp.blogspot.com/_ojiyfepcnKk/SeejFtlYQjI/AAAAAAAAAOI/gMHAq5Fx0mM/s1600-h/ADAPAWSMethod.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SeejFtlYQjI/AAAAAAAAAOI/gMHAq5Fx0mM/s400/ADAPAWSMethod.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325404402919948850" /></a><br /><br />Note that you can find a link to the ADAPA WSDL file in the bottom of the help page of your ADAPA Instance. Also, note that all the models you uploaded in ADAPA are available for selection in the drop-down menu. In this example, we are using the Iris_NN model.<br /><br />Also make sure you provide Jitterbit with the appropriate Security information for accessing ADAPA by entering name and password. These are the same as the e-mail and password you used to login into the ADAPA Web Console (where you uploaded your predictive models).<br /><br />Jitterbit will extract the default web service URL and SoapAction HTTP from the WSDL. Congratulations! You have just finished setting up a "New WebServiceCall". See screenshot below.<br /><br /><a href="http://2.bp.blogspot.com/_ojiyfepcnKk/SeeigtmuNsI/AAAAAAAAAOA/Ko2ellFYlMs/s1600-h/ADAPAWSCall.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 380px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SeeigtmuNsI/AAAAAAAAAOA/Ko2ellFYlMs/s400/ADAPAWSCall.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325403767270422210" /></a><br /><br /><strong>Step 3</strong><br /><br />It in this step that we will define the mappings (or transformations) between our database tables and the web service call. We start by defining the transformation between the source database and the web service request. For that, right click on the second block named "Request" of the IrisScoring operation to create a "New Transformation". Select from the drop-down menus for Source - Database and for Target - Web Service Request. Jitterbit will then prompt you for a number of parameters. Enter then accordingly. <br /><br />Obviously, in order to finish building our request transformation we need to link our database source table to our web service request. After linking all fields (a simple operation in Jitterbit), the screen should look like the one below.<br /><br /><a href="http://3.bp.blogspot.com/_ojiyfepcnKk/Seej8srHp9I/AAAAAAAAAOQ/5ETbrYiyH6o/s1600-h/WSRequest.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 331px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/Seej8srHp9I/AAAAAAAAAOQ/5ETbrYiyH6o/s400/WSRequest.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5325405347568396242" /></a><br /><br />Let's now create a response transformation in which we will map the web service response back to a table in our database so that our model results can be saved appropriately. To create "New Transformation (2)", right click on the fourth block named "Response" and select from the drop-down menus for Source - Web Service Response and for Target - Database. Jitterbit will ask us for all the parameters necessary for the transformation to be completed, including selecting the Target Database as well as the database table we want to write to. Once we do that, Jitterbit will prompt us to link the web service response to the correct field in the target table. After linking is complete, the screen should look like the one below.<br /><br /><a href="http://2.bp.blogspot.com/_ojiyfepcnKk/SeZ7Wc9sAHI/AAAAAAAAANw/JJeuE9ybJw4/s1600-h/Target.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SeZ7Wc9sAHI/AAAAAAAAANw/JJeuE9ybJw4/s400/Target.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325079235074457714" /></a><br /><br />Our project is complete. By selecting the IrisScoring operation, the Jitterbit screen will look like the one below.<br /><br /><a href="http://4.bp.blogspot.com/_ojiyfepcnKk/SeZ8BJYzVEI/AAAAAAAAAN4/D80J9xt7_iY/s1600-h/Final.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 278px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SeZ8BJYzVEI/AAAAAAAAAN4/D80J9xt7_iY/s400/Final.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5325079968553849922" /></a><br /><br />Now it is time for us to deploy and submit the IrisScoring operation to the Jitterbit server. During execution, Jitterbit will read the data from the database, send it over to ADAPA for scoring via a web service request and write the response back to the same database.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-1892963006187453929?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-86030097308639533192009-03-24T16:22:00.000-07:002009-04-29T09:26:21.353-07:00ADAPA Predictive Analytics Scoring Engine - Demo VideoIn order to fully leverage the power of predictive analytics and data mining algorithms, users need the capability to seamlessly integrate statistical decision models into operational systems. Fortunately, the maturity of open standards and cloud computing allow us to finally deliver an agile deployment framework that combines <em>on-demand scalability</em> and a cost-effective <em>Software-as-a-Service</em> (SaaS) licensing model.<br /><br />The <a href="http://www.zementis.com/products.htm">Zementis ADAPA Predictive Analytics Edition</a> on the Amazon Elastic Compute Cloud (EC2) is a deployment and scoring engine, which delivers:<br /><ul><br /><li> Better ... Support of Open Standards </li><br /><li> Faster ... Deployment and Scoring </li><br /><li> Cheaper ... Total Cost of Ownership </li><br /><li> Easier ... Launch and Integration </li><br /></ul><br />Please take a few moments to watch the following video to learn why ADAPA is a true quantum leap for the predictive analytics industry and how it will empower your business to make better decisions today.<br /><br />Interested to experience ADAPA first hand? Let us take your Enterprise Decision Management (EDM) strategy to the next level and <a href="http://www.zementis.com/contact.htm">contact us</a> now for a free trial.<br /><br /><br /><object height="364" width="445"><param name="movie" value="http://www.youtube.com/v/8hNqxqrdXLI&amp;hl=en&amp;fs=1&amp;rel=0&amp;border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/8hNqxqrdXLI&amp;hl=en&amp;fs=1&amp;rel=0&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"></embed></object><br /><br />[<a href="http://www.zementis.com/videos/ADAPA_Demonstration.htm">High Res Video: ADAPA Predictive Analytics Scoring - Demo</a>]<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-8603009730863953319?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-3110295540118746382009-03-23T17:36:00.000-07:002009-04-29T09:27:55.647-07:00ADAPA means business - Predictive Analytics in 90 secondsWatch this short video to learn how ADAPA will help you predict future customer behavior today. What can predictive analytics do for you, when you deploy your predictive models in ADAPA and are able to start using them right away?<br /><br />Combining predictive analytics with cloud computing, ADAPA presents new opportunities to leverage predictive models in real-time or in batch mode, with new flexibility and at a lower total cost of ownership.<br /><br /><object height="364" width="445"><param name="movie" value="http://www.youtube.com/v/oBHYeGwNnvg&amp;hl=en&amp;fs=1&amp;rel=0&amp;border=1"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/oBHYeGwNnvg&amp;hl=en&amp;fs=1&amp;rel=0&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="364" width="445"></embed></object><br /><br />[<a href="http://www.zementis.com/videos/ADAPA_Cloud_short.htm">High Res Video: ADAPA Means Business</a>]<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-311029554011874638?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-54391391661217397372009-02-17T09:46:00.000-08:002009-04-03T17:09:50.638-07:00Data pre-processing in PMML and ADAPA - A PrimerPMML defines several kinds of simple data transformations. These are:<br /><ul><li><span style="font-weight: bold;">Normalization</span>: map values to numbers, the input can be continuous (element <span style="font-style: italic;">NormContinuous</span>) or discrete (element <span style="font-style: italic;">NormDiscrete</span>). </li><li><span style="font-weight: bold;">Discretization</span>: map continuous values to discrete values. </li><li><span style="font-weight: bold;">Value Mapping</span>: map discrete values to discrete values. </li><li><span style="font-weight: bold;">Functions</span>: derive a value by applying a function to one or more parameters.</li></ul>Below we will see how these transformations can be used and combined to allow for data pre-processing in PMML and ADAPA.<br /><br /><span style="font-weight: bold;font-size:130%;" >Normalization: NormContinuous</span><br /><br />This is a general method to normalize a continuous variable to another continuous variable. In the PMML code below, two normalizations take place and two derived variables are created. The first derived variable is named "DerivedNormalizedVar1" and the second "DerivedNormalizedVar2". The normalization itself is defined under the element<span style="font-style: italic;"> NormContinuous</span>. Typically, <span style="font-style: italic;">NormContinuous</span> is used to normalize input values between 0 and 1 as shown in the first normalization example. However, as shown in the second normalization example, one can have as many <span style="font-style: italic;">LinearNorm</span> elements as necessary and these do not need to normalized values between 0 and 1; the only restriction is that the first attribute <span style="font-style: italic;">orig</span> must be in increasing order. The normalized variable is then a linearly interpolated value between the <span style="font-style: italic;">LinearNorm</span> elements.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsRvrmQmPI/AAAAAAAAAKA/dJVeMynWG14/s1600-h/Fig_NormContinuous.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 163px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsRvrmQmPI/AAAAAAAAAKA/dJVeMynWG14/s400/Fig_NormContinuous.bmp" alt="" id="BLOGGER_PHOTO_ID_5303852497013610738" border="0" /></a><br />Note that in the second example, we are using the attribute <span style="font-style: italic;">outliers</span> to specify that any outliers to the normalization should be treated as extreme values. In this case, all "InputVar2" values lower than 100 will be assigned value "0" and all values greater than 900 will be assigned value "4".<br /><br /><span style="font-weight: bold;font-size:130%;" >Normalization: NormDiscrete</span><br /><br />This method is used to transform string values to numeric values. Many models encode string values into numeric values in order to perform mathematical functions. For example, regression and neural network models often split categorical and ordinal variables into multiple dummy<br />variables.<br /><br />The PMML code below implements the following logic:<br /><br />IF CategoricalInputVar1 == Partner<br />THEN<br />DerivedVar1 = 1<br />ELSE<br />DerivedVar1 = 0<br /><br />IF CategoricalInputVar1 == Associate<br />THEN<br />DerivedVar2 = 1<br />ELSE<br />DerivedVar2 = 0<br /><br />IF CategoricalInputVar1 == Colleague<br />THEN<br />DerivedVar1 = 1<br />ELSE<br />DerivedVar1 = 0<br /><br />In this example, variable "CategoricalInputVar1" has three possible valid values: "Partner", "Associate", and "Colleague". By using the <span style="font-style: italic;">NormDiscrete</span> element, we can create derived variables (the dummy variables in this case) that will be assigned values "1" or "0" depending on the value of the categorical input variable being processed.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsR9h6RaRI/AAAAAAAAAKI/csp1diPZvDg/s1600-h/Fig_NormDiscrete.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 136px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsR9h6RaRI/AAAAAAAAAKI/csp1diPZvDg/s400/Fig_NormDiscrete.bmp" alt="" id="BLOGGER_PHOTO_ID_5303852734931364114" border="0" /></a><br />Note that we are also handling missing values in this example. The <span style="font-style: italic;">mapMissingTo</span> attribute means that if the input value "CategoricalInputVar1" is missing then all three derived variables will be assigned "0".<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Discretization</span></span><br /><br />This method maps continuous values to discrete string values. For a continuous variable we define intervals and if the variable falls inside that interval, we assign to it the string value defined for that interval. In the PMML code below, the <span style="font-style: italic;">Discretize</span> element defines the continuous field "InputVar" which is to be discretized. The <span style="font-style: italic;">DiscretizeBin</span> elements define the intervals. The first one defines a bin which has a <span style="font-style: italic;">rightMargin</span> of 1000. By default, its left margin (attribute <span style="font-style: italic;">leftMargin</span>) is negative infinity. The closure attribute finally defines the interval as (-infinity,1000], i.e. the right margin is less than or equal to 1000. So if the value of the variable "InputVar" falls in this interval, we assign to the derived variable "DerivedVar" the string value “low”. Similarly, if the value of "InputVar" is in (1000,100000], the derived value is equal to "medium" and if it is in (100000,1000000), the derived value is equal to "high".<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsSIlmJWOI/AAAAAAAAAKQ/Gtd2OG24aLM/s1600-h/Fig_Discretize.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 162px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsSIlmJWOI/AAAAAAAAAKQ/Gtd2OG24aLM/s400/Fig_Discretize.bmp" alt="" id="BLOGGER_PHOTO_ID_5303852924899252450" border="0" /></a><br />The mapping from a continuous to a discrete variable can be many-to-one but not one-to-many. In other words, two intervals can be mapped to the same string value but the same interval may not have more than one string value. This implies that the intervals defined must be disjoint; there can be no overlap between two defined intervals.<br /><br />One can establish what should happen if the input is not in any of the defined intervals. The attribute <span style="font-style: italic;">defaultValue</span> in the <span style="font-style: italic;">Discretize</span> element establishes that if the input does not lie in any of the intervals (as for example, if "InputVar"=2,000,000), then by default it is assigned the value "extreme".<br /><br />Discretization can also be paired up with element <span style="font-style: italic;">NormDiscrete</span> to generate dummy variables which indicate if an input variable belongs to a certain interval. The PMML example shown below implements just that. We assume a numeric input variable named "InputVar" which leads to the creation of three dummy variables: "DerivedVar1", "DerivedVar2", and "DerivedVar3". These are used to indicate membership of "InputVar" to one of the following intervals: (-infinity,100], (100,200], and (200,+infinity).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsSSlC2CvI/AAAAAAAAAKY/qjh8SnyI1KU/s1600-h/Fig_NumericDiscretization.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 224px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsSSlC2CvI/AAAAAAAAAKY/qjh8SnyI1KU/s400/Fig_NumericDiscretization.bmp" alt="" id="BLOGGER_PHOTO_ID_5303853096549878514" border="0" /></a><br />Note that in this example, we are using the <span style="font-style: italic;">Discretize</span> element to map continuous values to an integer which is then used by the <span style="font-style: italic;">NormDiscrete</span> element to indicate interval membership.<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Value Mapping</span></span><br /><br />This method is used to map discrete values to discrete values. This is done by using a table which lists the input values and the mapped output values. Each row in the table refers to a possible value for the input variable. Each column in the table has a name which is used to refer to that column. This is defined inside the element <span style="font-style: italic;">MapValues</span>.<br /><br />In the PMML code below, the attribute <span style="font-style: italic;">outputColumn</span> in element <span style="font-style: italic;">MapValues</span> establishes that the mapped output value will be found in the column named "color". The element <span style="font-style: italic;">FieldColumnPair</span> uses the attribute <span style="font-style: italic;">field</span> to define the input for mapping which consists of one or more input variables. In this example, we use two variables "InputVar1" and "InputVar2". We find the input value in the "animal" column for "InputVar1" and the input value in the "property" column for "InputVar2" and map them to the output value in the"color" column.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsScs580xI/AAAAAAAAAKg/XQAjmDylYaA/s1600-h/Fig_MapValues.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 232px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsScs580xI/AAAAAAAAAKg/XQAjmDylYaA/s400/Fig_MapValues.bmp" alt="" id="BLOGGER_PHOTO_ID_5303853270458749714" border="0" /></a><br />The <span style="font-style: italic;">InlineTable</span> element finally defines the table to be used for value mapping. So for example, if variable "InputVar1" has the value "dog" and variable "InputVar2" has the value "smart", we find "dog" in column "animal" and "smart" in column "property", both in the first row. These are them mapped to the value in the column named "color" in the same row. In this way, derived field "DerivedVar" is assigned the value "red".<br /><br />As in the <span style="font-style: italic;">Discretize</span> element, the <span style="font-style: italic;">MapValues</span> element can have a <span style="font-style: italic;">defaultValue</span> attribute which specifies what to map the input to if it does not have a matching value in any row.<br /><br />In the PMML code below, we use elements <span style="font-style: italic;">MapValues</span> and <span style="font-style: italic;">NormDiscrete</span> to group small sets of categorical values. More specifically, we want to find out if input variable "VarInputColor" belongs to a specific group of colors. We do that by using the <span style="font-style: italic;">InLineTable</span> element of <span style="font-style: italic;">MapValues</span> to map different colors to the same number. We then use the element <span style="font-style: italic;">NormDiscrete</span> to create dummy variables which are used to indicate group membership. This problem can be represented schematically in the following way:<br /><br />IF VarInputColor is in ("Yellow","Red")<br />THEN<br />VarColorGroup_1 = 1<br />ELSE<br />VarColorGroup_1 = 0<br /><br />IF VarInputColor is in ("Blue","Green")<br />THEN<br />VarColorGroup_2 = 1<br />ELSE<br />VarColorGroup_2 = 0 <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsUQR3oL9I/AAAAAAAAALg/3NWuIguaTjs/s1600-h/Fig_InLineTable.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 288px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsUQR3oL9I/AAAAAAAAALg/3NWuIguaTjs/s400/Fig_InLineTable.bmp" alt="" id="BLOGGER_PHOTO_ID_5303855256066076626" border="0" /></a><br />Note that in the example shown above we are mapping missing values to value"2" and setting the default value to "1" inside the <span style="font-style: italic;">MapValues</span> transformation element. Derived field "GroupedInputColor" is assigned the result of the mapping between the input strings and the number representing the group. This variable is then used to generate the desired output. If "GroupedInputColor" contains value "1", variable "VarColorGroup_1" is assigned value "1", otherwise it is assigned value "0". If "GroupedInputColor" contains value "2", variable "VarColorGroup_2" is assigned value "1", otherwise it is assigned value "0". This is accomplished by the use of the <span style="font-style: italic;">NormDiscrete</span> element as described earlier.<br /><br />Large sets of values can be handled in ADAPA by an external mapping table. For example, imagine that you would like to map all existing colors (that you can imagine) into four different groups and then create dummy variables to indicate such grouping. You can design this table externally (ADAPA allows external tables to be referred from a PMML file) and use the PMML element <span style="font-style: italic;">TableLocator</span> to reference it from inside the <span style="font-style: italic;">MapValues</span> transformation element. The PMML code below implements this functionality.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsSsqn3PRI/AAAAAAAAAKw/97WRCUvq_Ks/s1600-h/Fig_TableLocator.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 224px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsSsqn3PRI/AAAAAAAAAKw/97WRCUvq_Ks/s400/Fig_TableLocator.bmp" alt="" id="BLOGGER_PHOTO_ID_5303853544723922194" border="0" /></a><br />Note that we are mapping missing values to value "4" and setting the default value to "3" inside the <span style="font-style: italic;">MapValues</span> transformation element. Derived field "GroupedInputColor" is assigned the result of the mapping between the input colors and the number representing the group they belong to. As before, variable "GroupedInputColor" is then used to generate the desired output through the use of the element NormDiscrete.<br /><br />The mapping table itself is only being referenced inside the element <span style="font-style: italic;">TableLocator</span>. We are using a PMML extension in this case to indicate to ADAPA that the mapping table we want to access is named "GroupedInputColor".<br /><br /><span style="font-size:130%;"><span style="font-weight: bold;">Functions</span></span><br /><br />If a certain transformation is to be applied to input data many times and to multiple fields, it makes sense to encapsulate the transformation inside a function and just use is as many times as necessary. This reduces the complexity of the PMML model and greatly simplifies its application. PMML provides a number of built-in functions as well as providing the capability for the user to define a user-defined function.<br /><br /><span style="font-weight: bold;">Built-in Functions</span><br /><br />ADAPA supports all PMML built-in functions. The complete list is shown below.<br /><ul><li>+, -, * and /</li><li>min, max, sum and avg</li><li>log10, ln, sqrt, abs, exp, pow, threshold, floor, ceil, round</li><li>uppercase</li><li>substring</li><li>trimBlanks</li><li>formatNumber</li><li>formatDatetime</li><li>dateDaysSinceYear</li><li>dateSecondsSinceYear</li><li>dateSecondsSinceMidnight</li></ul>Note that functions such as "min", "max", "sum" and "avg" take a variable number of parameters (derived fields or input fields) and return a single value which can then be assigned to a new derived field. Please refer to the <a href="http://www.dmg.org/v3-2/BuiltinFunctions.html">DMG website - Built-in Functions</a> for code examples and descriptions.<br /><br />The PMML code shown below implements the following arithmetic operation:<br /><span style="font-style: italic;">ResultVar=maximum(round(InputVar1/3.3),2^(1+log(1.3*InputVar2+1)))</span><br /><br />Note that it uses two different input variables: "InputVar1" and "InputVar2" as well as a number of numeric constants. The example shows many built-in functions which are used together to implement such a complex operation. The end result is assigned to derived variable "ResultVar".<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsU_bEXzcI/AAAAAAAAALo/-UH6kaCn6Oo/s1600-h/Fig_Arithmetic.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 248px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsU_bEXzcI/AAAAAAAAALo/-UH6kaCn6Oo/s400/Fig_Arithmetic.bmp" alt="" id="BLOGGER_PHOTO_ID_5303856065989299650" border="0" /></a><br /><span style="font-size:100%;"><span style="font-weight: bold;">ADAPA-Defined Functions</span></span><br /><br />Although PMML does not support boolean types, ADAPA defines many functions that support boolean operations. These are used to compare parameters which are required to be of identical type (e.g., strings or dates) or of compatible type for numeric variables (e.g., double vs. integer). The result is of boolean type: "true" or "false", which is evaluated by functions such as "if" and "not".<br /><br />ADAPA-defined functions which operate on two input attributes, e.g. "a" and "b", of identical or compatible types are:<br /><ul><li><span style="font-style: italic;">equal</span>: evaluates to "true" if "a" is equal to "b", "false" otherwise. </li><li><span style="font-style: italic;">notEqual</span>: evaluates to "true" if "a" is not equal to "b", "false" otherwise. </li><li><span style="font-style: italic;">lessThan</span>: evaluates to "true" if "a" is less than "b", "false" otherwise. </li><li><span style="font-style: italic;">lessOrEqual</span>: evaluates to "true" if "a" is less or equal to "b", "false" otherwise. </li><li><span style="font-style: italic;">greaterThan</span>: evaluates to "true" if "a" is greater than "b", "false" otherwise. </li><li><span style="font-style: italic;">greaterOrEqual</span>: evaluates to "true" if "a" is greater or equal to "b", "false" otherwise.<br /></li><li><span style="font-style: italic;">isIn</span>: evaluates to "true" if "a" is in "b", "false" otherwise. Attribute "b" in this case is an array of values.</li><li><span style="font-style: italic;">isNotIn</span>: evaluates to "true" if "a" is not in "b", "false" otherwise. Attribute "b" in this case is an array of values. </li></ul>ADAPA-defined functions which operate on a single input attribute, e.g. "a", are:<br /><ul><li><span style="font-style: italic;">isMissing</span>: evaluates to true if "a" is missing, i.e. equal to NULL, "false" otherwise. </li><li><span style="font-style: italic;">isNotMissing</span>: evaluates to "true" if "a" is not missing, "false" otherwise. </li></ul><br />ADAPA-defined functions which evaluate boolean operations are:<br /><ul><li><span style="font-style: italic;">not</span>: operates on a single boolean attribute. Negates existing boolean evaluation result. </li><li><span style="font-style: italic;">and</span>: summarizes the results of two or more independent boolean operations. Evaluates to "true" only if all operations are "true", "false" otherwise. </li><li><span style="font-style: italic;">or</span>: summarizes the results of two or more independent boolean operations. Evaluates to "true" if a single operation is "true", "false" only if all operations are "false". </li><li><span style="font-style: italic;">if</span>: implements IF-THEN-ELSE logic. The ELSE part is optional. </li></ul>Note that the ADAPA-defined functions were based on the PMML decision tree operators for simple and compound predicates(see <a href="http://www.dmg.org/v3-2/TreeModel.html">DMG website - Tree Model</a>).<br /><br />Below, we give a few examples of how these ADAPA-defined functions can be used to implement logical operations. We start with the PMML code below which implements the following logical and arithmetic operations:<br /><br />IF InputVar1 == "Partner"<br />THEN<br />DerivedVar1 = "P"<br />ELSE<br />DerivedVar2 = 2 * InputVar2<br /><br />In this example, we are using "InputVar1" which contains a string to assign values to two very different derived variables: "DerivedVar1" which is a string and "DerivedVar2" which is an integer.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsTBpf_lSI/AAAAAAAAALA/fqpVYVkUKlw/s1600-h/Fig_Logical1.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 240px;" src="http://3.bp.blogspot.com/_ojiyfepcnKk/SZsTBpf_lSI/AAAAAAAAALA/fqpVYVkUKlw/s400/Fig_Logical1.bmp" alt="" id="BLOGGER_PHOTO_ID_5303853905199732002" border="0" /></a><br />Note that the code uses the ADAPA-defined functions: "if", "equal", and "not" as well as the built-in fuction "*". The main reason for not using the "else" part of the "if" function is simply because we want to assign the "then" result to "DerivedVar1" and the "else" result to a different variable, "DerivedVar2". Data transformations in PMML are encapsulated under a single <span style="font-style: italic;">DerivedField</span> element.<br /><br />The PMML code below assumes that both "then" and "else" parts of the "if" use the same derived variable "DerivedVar1" to implement the following operations:<br /><br />IF InputVar1 == "Partner"<br />THEN<br />DerivedVar1 = "5.1 * InputVar2"<br />ELSE<br />DerivedVar1 = "InputVar2 / 3.3"<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsTI0JA3eI/AAAAAAAAALI/QWA-zBNxgZM/s1600-h/Fig_Logical2.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 190px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SZsTI0JA3eI/AAAAAAAAALI/QWA-zBNxgZM/s400/Fig_Logical2.bmp" alt="" id="BLOGGER_PHOTO_ID_5303854028315221474" border="0" /></a><br />Note that in this case, "DerivedVar2" is not being used. The "then" and "else" part are being used to assign the same variable "DerivedVar1" the result of two different computations.<br /><br />We showed earlier how to use the Discretize element in conjunction with NormDiscrete to create dummy variables to indicate membership to numeric intervals. What if we would like to do just that, but this time for strings? The PMML code below exemplifies how this could be accomplished by using ADAPA-defined fuctions "if" and "lessOrEqual" in conjunction with the <span style="font-style: italic;">NormDiscrete</span> element.<br /><br />The PMML code below implements the following operations:<br /><br />IF InputVar less or equal to "Denmark"<br />THEN<br />DerivedVar1 = 1 (otherwise = 0)<br />ELSE<br />IF InputVar less or equal to "France"<br />THEN<br />DerivedVar2 = 1 (otherwise = 0)<br />ELSE<br />DerivedVar3 = 1 (otherwise = 0)<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsTV6Jj-AI/AAAAAAAAALQ/fusQiCySTVg/s1600-h/Fig_StringIntervals.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 256px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SZsTV6Jj-AI/AAAAAAAAALQ/fusQiCySTVg/s400/Fig_StringIntervals.bmp" alt="" id="BLOGGER_PHOTO_ID_5303854253266434050" border="0" /></a><br />Note that the three dummy variables: "DerivedVar1", "DerivedVar2", and "DerivedVar3" are used to indicate the membership of input variable "InputVar" to three different string intervals.<br /><br />Finally, we end our list of PMML code examples by showing the use of functions "isMissing" and "isIn" combined with function "if". The example shown in <xref linkend="setOperatorfig"> implements the following operations:<br /><br />IF InputVar is missing<br />THEN<br />DerivedVar = 1<br />ELSE<br />IF InputVar is in ("Partner", "Associate", "Colleague")<br />THEN<br />DerivedVar = 2<br />ELSE<br />DerivedVar = 3<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsTc35BymI/AAAAAAAAALY/cheshrni63s/s1600-h/Fig_ArrayMembership.bmp"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 188px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SZsTc35BymI/AAAAAAAAALY/cheshrni63s/s400/Fig_ArrayMembership.bmp" alt="" id="BLOGGER_PHOTO_ID_5303854372919298658" border="0" /></a><br /></xref>When defining a PMML document, the pre-processing of the input variables is mainly located inside the following PMML elements: <span style="font-style: italic;">TransformationDictionary</span> and <span style="font-style: italic;">LocalTransformations</span>.<br /><br />For the formal PMML schema definition of the transformations covered here, please refer to the <a href="http://www.dmg.org/v3-2/Transformations.html">PMML Transformations page</a> on the DMG website.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-5439139166121739737?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-10390740689090089552009-01-22T11:26:00.000-08:002009-06-02T11:56:01.255-07:00ADAPA® Web Service for Predictive Models Sample (for ADAPA® Enterprise Edition and Amazon EC2 users)The ADAPA® Web Service for Predictive Models allows execution of PMML models through two distinct web service calls. As the first web service option, the ADAPA® Models Web Service exposes each uploaded predictve model as a separate operation. The name of the model becomes the name of the operation, the input mining fields of the model becomes the operation's input parameters and the predicted mining field of the models becomes the output value. As a second option, the ADAPA® JDM Web Service follows the JDM standard.<br /><br />A sample client has been prepared and demonstrates the use of ADAPA® Models Web Service and ADAPA® JDM Web Service. This sample is available for download <a href="http://www.zementis.com/docs/adapa-2.16-sample-ws-client.zip">here</a>. The sample requires Java (version 5 or later) Development Kit and Apache Ant to execute. To execute the sample client, you need to have Java and Ant available in the system path.<br /><br />Details regarding configuration and execution of the sample client can be found in the ADAPA® Models WS Guide that you can download from the ADAPA® help page or from <a href="http://www.zementis.com/docs/AdapaModelsWSGuide.pdf">here</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-1039074068909008955?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-2050842316110919792009-01-08T16:01:00.000-08:002009-03-31T15:45:50.474-07:00Statistical Analysis Software R Featured in NYT ArticleWe highly recommend the following article about R in the New York Times: <a href="http://www.nytimes.com/2009/01/07/technology/business-computing/07program.html?pagewanted=1&amp;_r=1">Data Analysts Captured by R's Power.</a><br /><br />It shows how excellent open source software can prosper!<br /><br /><blockquote>NYT, January 6, 2009. Companies as diverse as Google, Pfizer, Merck, Bank of America, the InterContinental Hotels Group and Shell use it.<br />[...] those most familiar with the software estimate that close to 250,000 people work with it regularly.</blockquote><br /><br /><a href="http://www.zementis.com/">Zementis</a> has been working with the R community, specifically to extend the support for the <a href="http://adapasupport.zementis.com/2008/02/how-can-i-export-pmml-code-from-r.html">Predictive Model Markup Language</a> (PMML) standard which allows model exchange among various statistical software tools.<br /><br />Got models in R? Deploy and score them in ADAPA in minutes on the Amazon EC2 cloud computing infrastructure!<br /><br />If you develop your models in R, you can easily deploy and execute these models in the <a href="http://www.zementis.com/products.htm">Zementis ADAPA scoring engine</a> (using the PMML standard). This not only eliminates potential memory constraints in R but also speeds execution and allows SOA-based integration. For the IT department, ADAPA delivers reliability and scalability needed for production-ready deployment and real-time predictive analytics.<br /><br /><a href="http://www.zementis.com/contact.htm">Contact us</a> for a free trial!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-205084231611091979?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-79334032786190582972009-01-07T16:17:00.000-08:002009-04-06T10:45:22.503-07:00Rattle Version 2.4.0 Released - Open Source Data Mining and Extensive PMML SupportVersion 2.4.0 of the free data mining software, <a href="http://rattle.togaware.com/">Rattle</a>, has been released.<br /><br />Through its extensive <a href="http://knol.google.com/k/alex-guazzelli/pmml/3pz0mz6zvkz16/1">PMML</a> support, Rattle perfectly complements the <a href="http://www.zementis.com/products.htm">Zementis ADAPA</a> predictive analytics scoring engine. Build your predictive models in Rattle/R and then score/deploy/integrate them via ADAPA in your production environment.<br /><br /><blockquote>The aim of Rattle is to provide a simple and intuitive interface that allows a user to quickly load data from a CSV file (or via ODBC), transform and explore the data, build and evaluate models, and export models as PMML (Predictive Model Markup Language) or as scores. All of this with little knowledge of R.</blockquote><br /><br />For more details, please see the announcement at <a href="http://www.kdnuggets.com/news/2009/n01/8i.html">KDnuggets News</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-7933403278619058297?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-87204763485791159012009-01-05T15:49:00.000-08:002009-04-06T10:46:40.891-07:00ADAPA Predictive Analytics Scoring Engine - Security on Amazon EC2This posting addresses a question that many of our customers have asked: "<em>Is my data secure with ADAPA on EC2</em>"? The short answer is "<strong>yes</strong>".<br /><br />Zementis has implemented extensive security measures to ensure that your data and your predictive models are protected with the ADAPA scoring engine:<br /><br />- <strong>Private:</strong> nothing is shared, your ADAPA instance is under your full control and only you have the access keys.<br /><br />- <strong>Secure:</strong> access is only granted via HTTPS, management console and web service are password protected.<br /><br />- <strong>Firewall</strong>: ADAPA utilizes the Amazon EC2 firewall to the extent of maximum lockdown.<br /><br />- <strong>No residual information:</strong> once you terminate your instance, all models/data are deleted within seconds.<br /><br /><br />We would like to point out the <a href="http://s3.amazonaws.com/aws_blog/AWS_Security_Whitepaper_2008_09.pdf">AWS Security Whitepaper</a> which outlines the security processes implemented by AWS. In addition to various technical details, key information in this whitepaper is that AWS is in compliance with Sarbanes Oxley (SOX), SAS70 Type II, and that AWS customers have built HIPAA-compliant healthcare applications.<br /><br />The Zementis ADAPA predictive analytics scoring engine on Amazon allows you to deploy your <a href="http://www.dmg.org/">PMML models</a> within minutes. It is a fully hosted SaaS solution with no up-front cost. You only pay for what you use, starting at less than $1/hour of machine time. <a href="http://www.zementis.com/howtobuy.htm">Subscribe now</a> to try it at no risk or read more about the <a href="http://www.zementis.com/predictive_analytics_edition.htm">features of ADAPA</a>.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-8720476348579115901?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-86873091911104908412008-12-18T16:58:00.000-08:002009-04-06T10:53:21.515-07:00KNIME 2.0 Adds PMML Import and PMML Export<a href="http://www.zementis.com/">Zementis</a> is a fervent supporter of open standards for predictive analytics and data mining. As the <a href="http://www.dmg.org/">Predictive Model Markup Language</a> (PMML) standard continues to gain momentum, we are pleased to see that the open source tool <a href="http://www.knime.org/">KNIME</a> 2.0 has added support for PMML export and import as part of their latest release.<br /><br />At Zementis, we have already tested the KNIME PMML export quite extensively and we are excited to report that it works well with ADAPA, our PMML scoring engine.<br /><br />KNIME 2.0 currently exports PMML 3.1 which can be converted to the latest PMML 3.2 format via the <a href="http://www.zementis.com/pmml_converters.htm">Zementis PMML Converter</a>. Once converted to PMML 3.2, you can deploy, integrate, and execute your predictive models in <a href="http://www.zementis.com/products.htm">ADAPA</a> in real-time or in batch mode. ADAPA is available as a SaaS cloud computing solution and can be launched in minutes via <a href="http://www.zementis.com/howtobuy.htm">Amazon EC2</a>.<br /><br />In addition for the native import/export nodes for PMML, KNIME also provides access to an R node that allows the export of PMML. This node leverages the <a href="http://www.zementis.com/pmml_exporters.htm">R PMML export library</a> that <a href="http://www.zementis.com/">Zementis</a> has been supporting and which has been covered extensively in the <a href="http://adapasupport.zementis.com/search/label/R">ADAPA support blog</a>.<br /><br />The <a href="http://www.knime.org/blog/export-and-convert-r-models-pmml-within-knime">KNIME blog</a> provides a detailed description about how to convert R models into PMML.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-8687309191110490841?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com1tag:blogger.com,1999:blog-2366420135435218933.post-75273496112989081452008-11-26T16:26:00.000-08:002009-04-06T10:48:35.122-07:00Talk at the Forum on Analytics - San DiegoWe recently gave a talk (11/12/08) at the <a href="http://www.sdsic.org/ForumOnAnalytics.htm">Forum on Analytics</a> (sponsored by the San Diego Software Industry Council - SDSIC). The talk was entitled "Easy Expression and Execution of Data Mining Models through PMML". Please click <a href="http://www.zementis.com/docs/ForumAnalytics_Presentation.pdf">here to see the presentation slides</a>. The presentation transcripts follow below (after the abstract).<br /><span style="font-weight: bold;"><br />Presentation Abstract</span><br /><br />PMML (Predictive Model Markup Language) is an XML-based language used to define data mining models. It was specified by the Data Mining Group, an independent group of leading technology companies. By providing a uniform standard to represent predictive models, PMML allows for the exchange of predictive solutions between different applications and various vendors. Many statistical packages already support the PMML standard; these include, for example, SAS and SPSS. In an effort to broaden the scientific workbench available to data mining scientists and to support the open source community, Zementis recently contributed code to the R project. In particular, we implemented the export of neural network models built with the nnet R package as well as Support Vector Machines built with the ksvm R package. The same PMML exporter can also produce decision trees built with rpart and linear regression models built with lm. The PMML exporter package is currently available through CRAN (the Comprehensive R Archive Network).<br /><br />All of the R exported PMML 3.2 models are readily available to be uploaded into an execution engine for scoring or classification. For example, the ADAPA engine, which can be used for testing and exploration, can be accessed directly through the Zementis website or it can be downloaded as a gadget which can be added to a personalized iGoogle console. This service is available free of charge and leverages the Amazon Elastic Compute Cloud (Amazon EC2).<br /><br />Our aim here is to show how one can quickly build a data mining model in R, such as a Support Vector Machine, and use the PMML exporter to produce a model file which can be uploaded and executed in a different application. We demonstrate how one can use data containing expected results to verify correct model deployment. If all computed and expected values match, the model can be considered ready for production, i.e. available for generating predictions on incoming data as part of an overall enterprise decision management strategy. From R to ADAPA, we use PMML as an effective way to express and execute data mining models.<br /><br />Our work shows how PMML can be effectively used to allow for model exchange between different applications. Also, it highlights how one can benefit from an open-source statistical package such as R to easily export models into PMML and upload them into ADAPA, a light-weight scoring engine which consumes several PMML 3.2 models. The ease of model expression and execution allows data mining scientists to concentrate on the important tasks: data analysis and model building. Real-time, scalable execution is handled through software tools which communicate through a common language, PMML.<br /><br />Below, please find the transcripts of our talk, organized per slide.<br /><br /><span style="font-style: italic;">Slide 1</span> - Title<br /><br /><span style="font-style: italic;">Slide 2</span><br /><br />My talk will be divided in 3 parts all of which are centered around Open Standards. I will start by talking about the Development of Predictive Models using R. I will then talk about Deployment and in doing so I will focus on PMML. Finally, I will talk about the real-time execution of PMML files.<br /><br /><span style="font-style: italic;">Slide 3</span><br /><br />So, R is our software of choice for this presentation, given that it is an open source and a GNU project. R is available for free over the internet. R allows for data manipulation, calculation, and graphical display. It provides a wide variety of statistical techniques and it is highly extensible.<br /><br />But, how to export models out of R? Once you build your models in R, you can easily export them into PMML.<br /><br />We recently contributed code to the R PMML package which can now export a variety of modeling techniques which include … to name a few:<br /><br />Neural Networks<br />Support Vector Machines<br />Decision Trees<br />Regression Models<br />…<br /><br /><span style="font-style: italic;">Slide 4</span><br /><br />Great! But, what is PMML? PMML stands for Predictive Model Markup Language. It is an XML-based language which is the de facto standard for exchanging predictive models between compliant applications. For this reason, PMML avoids proprietary issues and incompatibilities<br /><br />PMML provides a clear separation of tasks in which model deployment easily follows model development. In this way, PMML frees scientists to focus on model building. PMML eliminates the need for custom model deployment. In doing so, it ensures scalability and reliability.<br /><br /><span style="font-style: italic;">Slide 5</span><br /><br />PMML is a mature standard and is widely supported by the industry. It is developed and maintained by the Data Mining Group which is a vendor independent consortium with several major supporters including IBM, Oracle, Microsoft, SAS, SPSS, Fair Isaac and Zementis.<br /><br /><span style="font-style: italic;">Slide 6</span><br /><br />A single PMML file can be used to represent data transformations and well as the model itself. In doing so, PMML brings data transformations and statistical models together.<br /><br />PMML allows for the definition of a data dictionary which is used to define all the raw data fields coming into the model, including missing value strategy and outlier treatment.<br /><br />Several data transformations can also be expressed in PMML which can be used to extract feature detectors from the raw data.<br /><br />On the other hand, post-processing of results allows for tailored decisions.<br /><br /><span style="font-style: italic;">Slide 7</span><br /><br />So, here it is, R … The R GUI is very simple.<br /><br />Imagine that we want to build a neural network model to solve the Iris classification problem. In this case, all we need to do is upload the R neural network package NNET.<br /><br />We then assign the data file containing the IRIS data set to the R object we called Iris.<br /><br />And call NNET with the right parameters which include the data set used to train the model as well as the size of the hidden layer. We assign the network to the R object IrisNet<br /><br />Once trained, this network can be easily exported into PMML. We need to upload the PMML package first and then call it with our neural network object as a parameter.<br /><br /><span style="font-style: italic;">Slide 8</span><br /><br />ET VOILA’!!!<br /><br />Here is your PMML code. Hot from the oven!<br /><br />Note the data dictionary which contains a description of the four input variables used to train the model.<br /><br />Also note that in this simple example, there were no data transformations. We are using the input data AS IS.<br /><br /><span style="font-style: italic;">Slide 9</span><br /><br />So, you did all your data analysis, built your model and generate PMML using R … but what now?<br /><br />What can you do if you need to execute this model on a Iris Field and use it in real-time?<br /><br /><span style="font-style: italic;">Slide 10</span><br /><br />This is where a predictive analytics scoring engine fits in. We are going to use ADAPA here as an example.<br /><br />ADAPA allows for data transformations and models to be uploaded and executed in real time via web-services calls.<br /><br />It is an environment to manage and execute not only one but many predictive models and rule sets.<br /><br />ADAPA is not a model building environment. We used R for that!<br /><br /><span style="font-style: italic;">Slide 11</span><br /><br />This is a screen-shot of the ADAPA management console.<br /><br />PMML files are easily uploaded and maintained through this interface.<br /><br />Note that several models have already been uploaded into ADAPA including the IRIS Neural Network model we just built using R.<br /><span style="font-style: italic;"><br />Slide 12</span><br /><br />Once a model is uploaded, it needs to be validated. This is accomplished via a score matching test.<br /><br />In this case we uploaded 150 IRIS data records containing the input variables as well as the expected output. ADAPA will then compare and match computed and expected values.<br /><br />If any mismatches are found, ADAPA allows for complete traceability of its internal decisions.<br /><br /><span style="font-style: italic;">Slide 1</span><br /><br />Great! I just showed you how to Easy Express and Execute Data Mining Models using PMML … all in 6 steps.<br /><br />R allows for Data Analysis, Model Building, and PMML Export.<br /><br />PMML can then be uploaded into a compliant decision engine.<br /><br />Data reaches the engine via web-service calls.<br /><br />And in so doing,<br /><br />Model execution is performed in real-time.<br /><br /><span style="font-style: italic;">Slide 14</span> - Thank you!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-7527349611298908145?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-42068941998549889642008-11-26T14:39:00.000-08:002009-04-06T10:54:43.507-07:00More Analytics Moves to the Amazon Cloud<p>Please see James Taylor's excellent blog "<a href="http://jtonedm.com/2008/11/25/more-analytics-in-the-cloud/">More Analytics in the Cloud</a>" regarding an announcement related to cloud computing and analytics. Mathematica and MATLAB are following Zementis and now offer solutions on Amazon EC2 that focus on complex and computationally intensive applications.</p><p>We launched our <a href="http://www.zementis.com/">ADAPA predictive analytics decision engine</a> on EC2 which allows users to deploy, integrate, and execute statistical scoring models, e.g., using algorithms like neural networks, support vector machine (SVM), decision tree, and various regression models. </p><p>Finally, companies have the option to save a lot of software licensing cost by <a href="http://jtonedm.com/2008/06/20/buying-predictive-analytics-like-books-zementis-adapa/">buying predictive analytics like books</a>, under a cost effective pay-as-you-go SaaS license model.</p><p>It is great to see more mathematical applications migrate to the cloud. This is one of the best opportunities where cloud computing can reduce cost and complexity of implementing computational efforts in HPC, large-scale simulations, and predictive analytics.</p><p></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-4206894199854988964?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-29367370635726221172008-11-11T13:18:00.001-08:002009-04-29T10:42:03.752-07:00R to PMML Export Video TutorialWe created a brief video to demonstrate how easy it is to export PMML from R. The Predictive Model Markup Language is the industry standard which allows you to exchange statistical models between a variety of software solutions.<br /><br /><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/3t8LiXlBL40&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/3t8LiXlBL40&hl=en&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object><br /><br />[<a href="http://www.zementis.com/videos/IrisNN_R_PMML_demo2.htm">High Res Video: Exporting PMML from R</a>]<br /><br />This example walks through the steps required to create a neural network model for the Iris classification problem and then export the model as a <span class="blsp-spelling-error" id="SPELLING_ERROR_2">PMML</span> file. Once exported in <span class="blsp-spelling-error" id="SPELLING_ERROR_3">PMML</span> format, the model is ready to be deployed and executed, e.g., in the <span class="blsp-spelling-error" id="SPELLING_ERROR_4">Zementis</span> <a href="http://www.zementis.com/predictive_analytics_edition.htm"><span class="blsp-spelling-error" id="SPELLING_ERROR_5">ADAPA</span> scoring engine</a>.<br /><br />To follow this example, you will need to download the <a href="http://cran.r-project.org/web/packages/pmml/index.html"><span class="blsp-spelling-error" id="SPELLING_ERROR_7">PMML</span> package</a>, and the <a href="http://www.zementis.com/pmml_examples/R_nnet_Iris_normalized.csv">Iris.<span class="blsp-spelling-error" id="SPELLING_ERROR_8">csv</span> data file</a>.<br /><div></div><br /><div></div><br /><div>Please refer to the following articles for a more comprehensive <a href="http://adapasupport.zementis.com/2008/05/what-is-scoop-behind-pmml-and-amazon.html">introduction to <span class="blsp-spelling-error" id="SPELLING_ERROR_9">PMML</span></a> and additional information about <a href="http://adapasupport.zementis.com/2008/02/how-can-i-export-pmml-code-from-r.html"><span class="blsp-spelling-error" id="SPELLING_ERROR_10">PMML</span> export for R</a>.</div><br /><div></div><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-2936737063572622117?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-87774445193616692652008-11-04T13:45:00.000-08:002009-04-06T10:52:48.888-07:00The Synergy of Rules and Predictive Analytics<p>While attending the <a href="http://www.businessrulesforum.com/">Business Rules Forum 2008</a> in Orlando, it was apparent that many of the rules engine vendors have discovered the value of predictive analytics and consider supporting the <a href="http://adapasupport.zementis.com/2008/02/what-is-pmml-and-how-can-i-learn-more.html">Predictive Model Markup Language (<span class="blsp-spelling-error" id="SPELLING_ERROR_0">PMML</span>)</a> standard. As part of the Enterprise Decision Management track of the conference, <span class="blsp-spelling-error" id="SPELLING_ERROR_1">Zementis</span> presented on open source, open standards, and cloud computing under the title of <a href="http://www.businessrulesforum.com/abstracts.php?id=368">Agile Deployment of Predictive Analytics Using Amazon EC2.</a><br /><br />The synergies of rules and predictive models form the foundation for an <a href="http://smartenoughsystems.com/About-EDM.html">Enterprise Decision Management</a> strategy. While rules describe explicit knowledge, predictive analytics leverages implicit knowledge that is embedded in your data.<br /><br />At <span class="blsp-spelling-error" id="SPELLING_ERROR_2">Zementis</span>, we have long combined rules and predictive models for better decisions. Our <a href="http://www.zementis.com/products.htm"><span class="blsp-spelling-error" id="SPELLING_ERROR_3">ADAPA</span> decision engine</a> is available as an Enterprise Edition which seamlessly integrates the <a href="http://www.jboss.com/products/rules">Drools rules engine.</a> If you are already using Drools, you can effectively deploy predictive models in your business process with minimal effort.<br /><br />Even if you are using a rules engine from <a href="http://www.ilog.com/products/businessrules/"><span class="blsp-spelling-error" id="SPELLING_ERROR_4">Ilog</span></a>, <a href="http://www.corticon.com/"><span class="blsp-spelling-error" id="SPELLING_ERROR_5">Corticon</span></a>, or another rules engine vendor, <span class="blsp-spelling-error" id="SPELLING_ERROR_6">ADAPA</span> provides an easy, <span class="blsp-spelling-error" id="SPELLING_ERROR_7">SOA</span>-based integration via web services. Predictive analytics does not have to be complex or costly to deploy, if you follow open standards and leverage best-of-breed solutions.<br /><br />Want to learn more about combining rules and predictive analytics? Please <a href="http://www.zementis.com/contact.htm">contact us!</a></p><p></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-8777444519361669265?l=adapasupport.zementis.com'/></div>MZhttp://www.blogger.com/profile/14660336668839343858noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-27075584236912185582008-10-28T16:35:00.000-07:002009-04-06T11:08:37.405-07:00How are data transformations represented in PMML?PMML supports several kinds of data transformations. Below, we list the most common together with examples.<br /><br />Data transformations involved in the pre-processing of the input variables/fields are mainly located inside the following PMML elements: TransformationDictionary and LocalTransformations.<br /><br />For the formal PMML schema definition of the transformations covered here, please refer to the <a href="http://www.dmg.org/v3-2/Transformations.html">PMML Transformations page</a> on the DMG website.<br /><br /><span style="font-weight: bold;">Value Mapping</span><br /><br />Value mapping can be used to map discrete values to discrete values. The example below shows how to map a categorical field (color) into a numerical field (derived_color).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SQeq5X4ySiI/AAAAAAAAAIQ/jNzjzBkIxV8/s1600-h/MapValues_1.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 317px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SQeq5X4ySiI/AAAAAAAAAIQ/jNzjzBkIxV8/s400/MapValues_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5262362592247171618" border="0" /></a><br />Note that in this example, we are mapping yellow to 3, white to 1, blue to 6, and green to 4.<br /><br />The original input field named <span style="font-style: italic;">color</span> needs to be defined in the DataDictionary element. The derived field, the result of our data transformation is now called <span style="font-style: italic;">derived_color</span>. This field can subsequently be used by the model as an input variable or used as input for another data transformation.<br /><span style="font-weight: bold;"><br />Discretization</span><br /><br />Discretization is used to map continuous values to discrete values. The example below shows how to discretize a continuous field (units) into a discrete field (derived_units).<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ojiyfepcnKk/SQe2vgWAiII/AAAAAAAAAIY/ugalZofsS98/s1600-h/Discretization_1.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 237px;" src="http://4.bp.blogspot.com/_ojiyfepcnKk/SQe2vgWAiII/AAAAAAAAAIY/ugalZofsS98/s400/Discretization_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5262375616858065026" border="0" /></a><br />In this example, we are transforming an interval to a discrete value, more specifically, discretize will transform [1,2[ to 1, [2,3[ to 2, and [3,100] to 3.<br /><br />The new field is now called <span style="font-style: italic;">derived_units</span> and can be used as input to another transformation or to the model itself.<br /><br /><span style="font-weight: bold;">Normalization</span><br /><br />As specified in the DMG website, normalization provides a basic framework for mapping input values to specific value ranges, usually the numeric range [0 .. 1].<br /><span style="font-style: italic;"><br />NormContinuous</span><br /><br />Normalization is used, e.g., in neural networks. In fact, if you export your neural network model using SPSS (starting with version 16), the PMML code generated will contain this kind of transformation for the neural inputs. The R PMML package will also generate a file containing the normalization of input variables for Support Vector Machines (SVMs). The example below was extracted from the <a href="http://www.zementis.com/pmml_examples.htm">Iris_SVM.xml</a> file available in the Zementis website.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_ojiyfepcnKk/SQe7hJC3xPI/AAAAAAAAAIg/BrIFrOIK2sw/s1600-h/Normalization.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 81px;" src="http://1.bp.blogspot.com/_ojiyfepcnKk/SQe7hJC3xPI/AAAAAAAAAIg/BrIFrOIK2sw/s400/Normalization.jpg" alt="" id="BLOGGER_PHOTO_ID_5262380867643753714" border="0" /></a><br />The PMML element NormContinuous can be used to implement simple normalization functions such as the z-score transformation (X - m ) / s, where m is the mean value and s is the standard deviation.<br /><span style="font-style: italic;"><br />NormDiscrete</span><br /><br />The NormDiscrete element is used to implement the dummyfication of categorical or ordinal fields. For example, if you have a categorical variable called <span style="font-style: italic;">Marital</span> with the following possible values: A<span style="font-style: italic;">bsent, Divorced, Married, Married-spouse-absent, Unmarried, </span>and <span style="font-style: italic;">Widowed</span>, you may want these to be dummyfied (i.e. translated into 0s and 1s) for use by a neural network or SVM. The example below shows the use of element NormDiscrete to accomplish just that.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ojiyfepcnKk/SQjOEH_PMRI/AAAAAAAAAIw/P4duwOhUXzU/s1600-h/NormDiscrete.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 240px;" src="http://2.bp.blogspot.com/_ojiyfepcnKk/SQjOEH_PMRI/AAAAAAAAAIw/P4duwOhUXzU/s400/NormDiscrete.jpg" alt="" id="BLOGGER_PHOTO_ID_5262682734841508114" border="0" /></a><br />The set of NormDiscrete instances which refer to input field <span style="font-style: italic;">Marital</span> define a fan-out function which maps a single input field to a set of normalized fields. Note that if <span style="font-style: italic;">Marital</span> is equal to Married, the field <span style="font-style: italic;">derived_MaritalMarried</span> will be assigned a value equals to 1.0 and all other <span style="font-style: italic;">derived_MaritalX</span> fields shown will be assigned values equal to 0.<br /><br />This code was extrated from the <a href="http://www.zementis.com/pmml_examples.htm">Audit_SVM.xml</a> file available in the Zementis website. It is automatically exported by the <a href="http://adapasupport.zementis.com/2008/02/what-types-of-pmml-models-can-i-export.html">R PMML package for SVMs</a> built using the R ksvm (kernlab) package.<br /><br /><span style="font-weight: bold;">Functions</span><br /><br />PMML offers several built-in functions, all of which are supported by ADAPA. The list is as follows:<br /><br />1. +, -, * and /<br />2. min, max, sum and avg<br />3. log10, ln, sqrt, abs, exp, pow, threshold, floor, ceil, round<br />4. uppercase<br />5. substring<br />6. trimBlanks<br />7. formatNumber<br />8. formatDatetime<br />9. dateDaysSinceYear<br />10. dateSecondsSinceYear<br />11. dateSecondsSinceMidnight<br /><br />You can find several examples of the use of such functions in the <a href="http://www.dmg.org/v3-2/BuiltinFunctions.html">DMG website</a>.<br /><br />Note that functions such as min, max, sum and avg take a variable number of parameters (derived fields or input fields) and return a single value which you would then assign to a new derived field.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-2707558423691218558?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0tag:blogger.com,1999:blog-2366420135435218933.post-66793808575648303532008-10-22T15:19:00.000-07:002009-04-06T11:09:42.271-07:00List of PMML consumers and producersEver wonder what statistical packages out there consume and produce PMML? And if so, what techniques are supported? With the help of the <a href="http://www.dmg.org/">DMG</a>, we have compiled a table of PMML compliant companies and software. Check it out <a href="http://knol.google.com/k/alex-guazzelli/pmml-list-of-consumers-and-producers/3pz0mz6zvkz16/2#">here</a> (table entries are shown in alphabetical order).<br /><br />If your company or software is not listed in the table, please let us know and we will update it. Thanks!<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2366420135435218933-6679380857564830353?l=adapasupport.zementis.com'/></div>AGhttp://www.blogger.com/profile/17011386043635933507noreply@blogger.com0