http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/5b520d3f/templates/ecommercerecommendation/train-with-rate-event/index.html
----------------------------------------------------------------------
diff --git a/templates/ecommercerecommendation/train-with-rate-event/index.html 
b/templates/ecommercerecommendation/train-with-rate-event/index.html
new file mode 100644
index 0000000..d0d8ec8
--- /dev/null
+++ b/templates/ecommercerecommendation/train-with-rate-event/index.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html><html><head><title>Train with Rate Event (E-Commerce 
Recommendation)</title><meta charset="utf-8"/><meta content="IE=edge,chrome=1" 
http-equiv="X-UA-Compatible"/><meta name="viewport" 
content="width=device-width, initial-scale=1.0"/><meta class="swiftype" 
name="title" data-type="string" content="Train with Rate Event (E-Commerce 
Recommendation)"/><link rel="canonical" 
href="https://docs.prediction.io/templates/ecommercerecommendation/train-with-rate-event/"/><link
 href="/images/favicon/normal-b330020a.png" rel="shortcut icon"/><link 
href="/images/favicon/apple-c0febcf2.png" rel="apple-touch-icon"/><link 
href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800"
 rel="stylesheet"/><link 
href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" 
rel="stylesheet"/><link href="/stylesheets/application-3a3867f7.css" 
rel="stylesheet" type="text/css"/><script src="//cdnjs.cloudflare.com/ajax/libs/
 html5shiv/3.7.2/html5shiv.min.js"></script><script 
src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script
 src="//use.typekit.net/pqo0itb.js"></script><script>try{Typekit.load({ async: 
true });}catch(e){}</script></head><body><div id="global"><header><div 
class="container" id="header-wrapper"><div class="row"><div 
class="col-sm-12"><div id="logo-wrapper"><span id="drawer-toggle"></span><a 
href="#"></a><a href="http://predictionio.incubator.apache.org/";><img 
alt="PredictionIO" id="logo" 
src="/images/logos/logo-ee2b9bb3.png"/></a></div><div id="menu-wrapper"><div 
id="pill-wrapper"><a class="pill left" 
href="/gallery/template-gallery">TEMPLATES</a> <a class="pill right" 
href="//github.com/apache/incubator-predictionio/">OPEN 
SOURCE</a></div></div><img class="mobile-search-bar-toggler hidden-md 
hidden-lg" 
src="/images/icons/search-glass-704bd4ff.png"/></div></div></div></header><div 
id="search-bar-row-wrapper"><div class="container-fluid" id="sear
 ch-bar-row"><div class="row"><div class="col-md-9 col-sm-11 col-xs-11"><div 
class="hidden-md hidden-lg" id="mobile-page-heading-wrapper"><p>PredictionIO 
Docs</p><h4>Train with Rate Event (E-Commerce Recommendation)</h4></div><h4 
class="hidden-sm hidden-xs">PredictionIO Docs</h4></div><div class="col-md-3 
col-sm-1 col-xs-1 hidden-md hidden-lg"><img id="left-menu-indicator" 
src="/images/icons/down-arrow-dfe9f7fe.png"/></div><div class="col-md-3 
col-sm-12 col-xs-12 swiftype-wrapper"><div class="swiftype"><form 
class="search-form"><img class="search-box-toggler hidden-xs hidden-sm" 
src="/images/icons/search-glass-704bd4ff.png"/><div class="search-box"><img 
src="/images/icons/search-glass-704bd4ff.png"/><input type="text" 
id="st-search-input" class="st-search-input" placeholder="Search 
Doc..."/></div><img class="swiftype-row-hider hidden-md hidden-lg" 
src="/images/icons/drawer-toggle-active-fcbef12a.png"/></form></div></div><div 
class="mobile-left-menu-toggler hidden-md hidden-lg"></div>
 </div></div></div><div id="page" class="container-fluid"><div class="row"><div 
id="left-menu-wrapper" class="col-md-3"><nav id="nav-main"><ul><li 
class="level-1"><a class="expandible" href="/"><span>Apache PredictionIO 
(incubating) Documentation</span></a><ul><li class="level-2"><a class="final" 
href="/"><span>Welcome to Apache PredictionIO 
(incubating)</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Getting Started</span></a><ul><li class="level-2"><a 
class="final" href="/start/"><span>A Quick Intro</span></a></li><li 
class="level-2"><a class="final" href="/install/"><span>Installing Apache 
PredictionIO (incubating)</span></a></li><li class="level-2"><a class="final" 
href="/start/download/"><span>Downloading an Engine Template</span></a></li><li 
class="level-2"><a class="final" href="/start/deploy/"><span>Deploying Your 
First Engine</span></a></li><li class="level-2"><a class="final" 
href="/start/customize/"><span>Customizing the Engine</span></a><
 /li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Integrating with Your App</span></a><ul><li class="level-2"><a 
class="final" href="/appintegration/"><span>App Integration 
Overview</span></a></li><li class="level-2"><a class="expandible" 
href="/sdk/"><span>List of SDKs</span></a><ul><li class="level-3"><a 
class="final" href="/sdk/java/"><span>Java & Android SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/php/"><span>PHP 
SDK</span></a></li><li class="level-3"><a class="final" 
href="/sdk/python/"><span>Python SDK</span></a></li><li class="level-3"><a 
class="final" href="/sdk/ruby/"><span>Ruby SDK</span></a></li><li 
class="level-3"><a class="final" href="/sdk/community/"><span>Community Powered 
SDKs</span></a></li></ul></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Deploying an Engine</span></a><ul><li 
class="level-2"><a class="final" href="/deploy/"><span>Deploying as a Web 
Service</span></a></li><li class="level-2"><a 
 class="final" href="/cli/#engine-commands"><span>Engine Command-line 
Interface</span></a></li><li class="level-2"><a class="final" 
href="/deploy/monitoring/"><span>Monitoring Engine</span></a></li><li 
class="level-2"><a class="final" href="/deploy/engineparams/"><span>Setting 
Engine Parameters</span></a></li><li class="level-2"><a class="final" 
href="/deploy/enginevariants/"><span>Deploying Multiple Engine 
Variants</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Customizing an Engine</span></a><ul><li class="level-2"><a 
class="final" href="/customize/"><span>Learning DASE</span></a></li><li 
class="level-2"><a class="final" href="/customize/dase/"><span>Implement 
DASE</span></a></li><li class="level-2"><a class="final" 
href="/customize/troubleshooting/"><span>Troubleshooting Engine 
Development</span></a></li><li class="level-2"><a class="final" 
href="/api/current/#package"><span>Engine Scala 
APIs</span></a></li></ul></li><li class="level-1"><a class=
 "expandible" href="#"><span>Collecting and Analyzing Data</span></a><ul><li 
class="level-2"><a class="final" href="/datacollection/"><span>Event Server 
Overview</span></a></li><li class="level-2"><a class="final" 
href="/cli/#event-server-commands"><span>Event Server Command-line 
Interface</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventapi/"><span>Collecting Data with 
REST/SDKs</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/eventmodel/"><span>Events Modeling</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/webhooks/"><span>Unifying Multichannel Data with 
Webhooks</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/channel/"><span>Channel</span></a></li><li 
class="level-2"><a class="final" 
href="/datacollection/batchimport/"><span>Importing Data in 
Batch</span></a></li><li class="level-2"><a class="final" 
href="/datacollection/analytics/"><span>Using Analytics Tools</span></a></li
 ></ul></li><li class="level-1"><a class="expandible" href="#"><span>Choosing 
 >an Algorithm(s)</span></a><ul><li class="level-2"><a class="final" 
 >href="/algorithm/"><span>Built-in Algorithm Libraries</span></a></li><li 
 >class="level-2"><a class="final" href="/algorithm/switch/"><span>Switching to 
 >Another Algorithm</span></a></li><li class="level-2"><a class="final" 
 >href="/algorithm/multiple/"><span>Combining Multiple 
 >Algorithms</span></a></li><li class="level-2"><a class="final" 
 >href="/algorithm/custom/"><span>Adding Your Own 
 >Algorithms</span></a></li></ul></li><li class="level-1"><a class="expandible" 
 >href="#"><span>ML Tuning and Evaluation</span></a><ul><li class="level-2"><a 
 >class="final" href="/evaluation/"><span>Overview</span></a></li><li 
 >class="level-2"><a class="final" 
 >href="/evaluation/paramtuning/"><span>Hyperparameter 
 >Tuning</span></a></li><li class="level-2"><a class="final" 
 >href="/evaluation/evaluationdashboard/"><span>Evaluation 
 >Dashboard</span></a></li><li class="level-2
 "><a class="final" href="/evaluation/metricchoose/"><span>Choosing Evaluation 
Metrics</span></a></li><li class="level-2"><a class="final" 
href="/evaluation/metricbuild/"><span>Building Evaluation 
Metrics</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>System Architecture</span></a><ul><li class="level-2"><a 
class="final" href="/system/"><span>Architecture Overview</span></a></li><li 
class="level-2"><a class="final" href="/system/anotherdatastore/"><span>Using 
Another Data Store</span></a></li></ul></li><li class="level-1"><a 
class="expandible" href="#"><span>Engine Template Gallery</span></a><ul><li 
class="level-2"><a class="final" 
href="/gallery/template-gallery/"><span>Browse</span></a></li><li 
class="level-2"><a class="final" 
href="/community/submit-template/"><span>Submit your Engine as a 
Template</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="#"><span>Demo Tutorials</span></a><ul><li class="level-2"><a 
class="final" hr
 ef="/demo/tapster/"><span>Comics Recommendation Demo</span></a></li><li 
class="level-2"><a class="final" href="/demo/community/"><span>Community 
Contributed Demo</span></a></li><li class="level-2"><a class="final" 
href="/demo/textclassification/"><span>Text Classification Engine 
Tutorial</span></a></li></ul></li><li class="level-1"><a class="expandible" 
href="/community/"><span>Getting Involved</span></a><ul><li class="level-2"><a 
class="final" href="/community/contribute-code/"><span>Contribute 
Code</span></a></li><li class="level-2"><a class="final" 
href="/community/contribute-documentation/"><span>Contribute 
Documentation</span></a></li><li class="level-2"><a class="final" 
href="/community/contribute-sdk/"><span>Contribute a SDK</span></a></li><li 
class="level-2"><a class="final" 
href="/community/contribute-webhook/"><span>Contribute a 
Webhook</span></a></li><li class="level-2"><a class="final" 
href="/community/projects/"><span>Community 
Projects</span></a></li></ul></li><li clas
 s="level-1"><a class="expandible" href="#"><span>Getting 
Help</span></a><ul><li class="level-2"><a class="final" 
href="/resources/faq/"><span>FAQs</span></a></li><li class="level-2"><a 
class="final" href="/support/"><span>Support</span></a></li></ul></li><li 
class="level-1"><a class="expandible" 
href="#"><span>Resources</span></a><ul><li class="level-2"><a class="final" 
href="/resources/intellij/"><span>Developing Engines with IntelliJ 
IDEA</span></a></li><li class="level-2"><a class="final" 
href="/resources/upgrade/"><span>Upgrade Instructions</span></a></li><li 
class="level-2"><a class="final" 
href="/resources/glossary/"><span>Glossary</span></a></li></ul></li></ul></nav></div><div
 class="col-md-9 col-sm-12"><div class="content-header hidden-md 
hidden-lg"><div id="page-title"><h1>Train with Rate Event (E-Commerce 
Recommendation)</h1></div></div><div id="table-of-content-wrapper"><h5>On this 
page</h5><aside id="table-of-contents"><ul> <li> <a 
href="#modification">Modification</a> <
 /li> </ul> </aside><hr/><a id="edit-page-link" 
href="https://github.com/apache/incubator-predictionio/tree/livedoc/docs/manual/source/templates/ecommercerecommendation/train-with-rate-event.html.md.erb";><img
 src="/images/icons/edit-pencil-d6c1bb3d.png"/>Edit this page</a></div><div 
class="content-header hidden-sm hidden-xs"><div id="page-title"><h1>Train with 
Rate Event (E-Commerce Recommendation)</h1></div></div><div 
class="content"><p>This examples demonstrates how to modify E-Commerce 
Recommendation template to use &quot;rate&quot; event as Training 
Data.</p><p>However, recent &quot;view&quot; event is still used for 
recommendation for new user (to recommend items similar to what new user just 
recently viewed) and the returned scores are not predicted rating but a ranked 
scores for new user.</p><p>This template also supports that the user may rate 
same item multiple times and latest rating value will be used for training. The 
modification can be further simplified if the support 
 of this case is not needed.</p><p>You can find the complete modified source 
code <a 
href="https://github.com/apache/incubator-predictionio/tree/develop/examples/scala-parallel-ecommercerecommendation/train-with-rate-event";>here</a>
 and the modification is based on E-Commerce Recommendation template 
v0.1.1.</p><h2 id='modification' class='header-anchors'>Modification</h2><h3 
id='datasource.scala' class='header-anchors'>DataSource.scala</h3><p>In 
DataSource, change <code>ViewEvent</code> case class to RateEvent. Add 
<code>rating: Double</code> is added to the RateEvent.</p><p>Change</p><div 
class="highlight scala"><table style="border-spacing: 0"><tbody><tr><td 
class="gutter gl" style="text-align: right"><pre class="lineno">1</pre></td><td 
class="code"><pre><span class="k">case</span> <span class="k">class</span> 
<span class="nc">ViewEvent</span><span class="o">(</span><span 
class="n">user</span><span class="k">:</span> <span 
class="kt">String</span><span class="o">,</span> <span clas
 s="n">item</span><span class="k">:</span> <span class="kt">String</span><span 
class="o">,</span> <span class="n">t</span><span class="k">:</span> <span 
class="kt">Long</span><span class="o">)</span>
+</pre></td></tr></tbody></table> </div> <p>to</p><div class="highlight 
scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" 
style="text-align: right"><pre class="lineno">1
+2</pre></td><td class="code"><pre><span class="c1">// MODIFIED
+</span><span class="k">case</span> <span class="k">class</span> <span 
class="nc">RateEvent</span><span class="o">(</span><span 
class="n">user</span><span class="k">:</span> <span 
class="kt">String</span><span class="o">,</span> <span 
class="n">item</span><span class="k">:</span> <span 
class="kt">String</span><span class="o">,</span> <span 
class="n">rating</span><span class="k">:</span> <span 
class="kt">Double</span><span class="o">,</span> <span class="n">t</span><span 
class="k">:</span> <span class="kt">Long</span><span class="o">)</span>
+</pre></td></tr></tbody></table> </div> <p>Modify TrainingData class to use 
rateEvent</p><div class="highlight scala"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12</pre></td><td class="code"><pre><span class="k">class</span> <span 
class="nc">TrainingData</span><span class="o">(</span>
+  <span class="k">val</span> <span class="n">users</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[(</span><span 
class="kt">String</span>, <span class="kt">User</span><span class="o">)],</span>
+  <span class="k">val</span> <span class="n">items</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[(</span><span 
class="kt">String</span>, <span class="kt">Item</span><span class="o">)],</span>
+  <span class="k">val</span> <span class="n">rateEvents</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[</span><span 
class="kt">RateEvent</span><span class="o">]</span> <span class="c1">// MODIFIED
+</span><span class="o">)</span> <span class="k">extends</span> <span 
class="nc">Serializable</span> <span class="o">{</span>
+  <span class="k">override</span> <span class="k">def</span> <span 
class="n">toString</span> <span class="k">=</span> <span class="o">{</span>
+    <span class="n">s</span><span class="s">"users: [${users.count()} 
(${users.take(2).toList}...)]"</span> <span class="o">+</span>
+    <span class="n">s</span><span class="s">"items: [${items.count()} 
(${items.take(2).toList}...)]"</span> <span class="o">+</span>
+    <span class="c1">// MODIFIED
+</span>    <span class="n">s</span><span class="s">"rateEvents: 
[${rateEvents.count()}] (${rateEvents.take(2).toList}...)"</span>
+  <span class="o">}</span>
+<span class="o">}</span>
+</pre></td></tr></tbody></table> </div> <p>Modify <code>readTraining()</code> 
function of <code>DataSource</code> to read &quot;rate&quot; events (commented 
with &quot;// MODIFIED&quot;). Replace all <code>ViewEvent</code> with 
<code>RateEvent</code>. Replace all <code>viewEvent</code> with 
<code>rateEvent</code>. Retrieve the rating value from the event 
properties:</p><div class="highlight scala"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41</pre></td><td class="code"><pre>
+  <span class="k">override</span>
+  <span class="k">def</span> <span class="n">readTraining</span><span 
class="o">(</span><span class="n">sc</span><span class="k">:</span> <span 
class="kt">SparkContext</span><span class="o">)</span><span class="k">:</span> 
<span class="kt">TrainingData</span> <span class="o">=</span> <span 
class="o">{</span>
+    <span class="k">val</span> <span class="n">eventsDb</span> <span 
class="k">=</span> <span class="nc">Storage</span><span class="o">.</span><span 
class="n">getPEvents</span><span class="o">()</span>
+
+    <span class="o">....</span>
+
+    <span class="c1">// get all "user" "rate" "item" events
+</span>    <span class="k">val</span> <span 
class="n">rateEventsRDD</span><span class="k">:</span> <span 
class="kt">RDD</span><span class="o">[</span><span 
class="kt">RateEvent</span><span class="o">]</span> <span class="k">=</span> 
<span class="n">eventsDb</span><span class="o">.</span><span 
class="n">find</span><span class="o">(</span> <span class="c1">// MODIFIED
+</span>      <span class="n">appId</span> <span class="k">=</span> <span 
class="n">dsp</span><span class="o">.</span><span class="n">appId</span><span 
class="o">,</span>
+      <span class="n">entityType</span> <span class="k">=</span> <span 
class="nc">Some</span><span class="o">(</span><span 
class="s">"user"</span><span class="o">),</span>
+      <span class="n">eventNames</span> <span class="k">=</span> <span 
class="nc">Some</span><span class="o">(</span><span class="nc">List</span><span 
class="o">(</span><span class="s">"rate"</span><span class="o">)),</span> <span 
class="c1">// MODIFIED
+</span>      <span class="c1">// targetEntityType is optional field of an 
event.
+</span>      <span class="n">targetEntityType</span> <span class="k">=</span> 
<span class="nc">Some</span><span class="o">(</span><span 
class="nc">Some</span><span class="o">(</span><span 
class="s">"item"</span><span class="o">)))(</span><span 
class="n">sc</span><span class="o">)</span>
+      <span class="c1">// eventsDb.find() returns RDD[Event]
+</span>      <span class="o">.</span><span class="n">map</span> <span 
class="o">{</span> <span class="n">event</span> <span class="k">=&gt;</span>
+        <span class="k">val</span> <span class="n">rateEvent</span> <span 
class="k">=</span> <span class="k">try</span> <span class="o">{</span>
+          <span class="n">event</span><span class="o">.</span><span 
class="n">event</span> <span class="k">match</span> <span class="o">{</span>
+            <span class="k">case</span> <span class="s">"rate"</span> <span 
class="k">=&gt;</span> <span class="nc">RateEvent</span><span 
class="o">(</span> <span class="c1">// MODIFIED
+</span>              <span class="n">user</span> <span class="k">=</span> 
<span class="n">event</span><span class="o">.</span><span 
class="n">entityId</span><span class="o">,</span>
+              <span class="n">item</span> <span class="k">=</span> <span 
class="n">event</span><span class="o">.</span><span 
class="n">targetEntityId</span><span class="o">.</span><span 
class="n">get</span><span class="o">,</span>
+              <span class="n">rating</span> <span class="k">=</span> <span 
class="n">event</span><span class="o">.</span><span 
class="n">properties</span><span class="o">.</span><span 
class="n">get</span><span class="o">[</span><span class="kt">Double</span><span 
class="o">](</span><span class="s">"rating"</span><span class="o">),</span> 
<span class="c1">// ADDED
+</span>              <span class="n">t</span> <span class="k">=</span> <span 
class="n">event</span><span class="o">.</span><span 
class="n">eventTime</span><span class="o">.</span><span 
class="n">getMillis</span><span class="o">)</span>
+            <span class="k">case</span> <span class="k">_</span> <span 
class="k">=&gt;</span> <span class="k">throw</span> <span class="k">new</span> 
<span class="nc">Exception</span><span class="o">(</span><span 
class="n">s</span><span class="s">"Unexpected event ${event} is 
read."</span><span class="o">)</span>
+          <span class="o">}</span>
+        <span class="o">}</span> <span class="k">catch</span> <span 
class="o">{</span>
+          <span class="k">case</span> <span class="n">e</span><span 
class="k">:</span> <span class="kt">Exception</span> <span 
class="o">=&gt;</span> <span class="o">{</span>
+            <span class="n">logger</span><span class="o">.</span><span 
class="n">error</span><span class="o">(</span><span class="n">s</span><span 
class="s">"Cannot convert ${event} to RateEvent."</span> <span 
class="o">+</span> <span class="c1">// MODIFIED
+</span>              <span class="n">s</span><span class="s">" Exception: 
${e}."</span><span class="o">)</span>
+            <span class="k">throw</span> <span class="n">e</span>
+          <span class="o">}</span>
+        <span class="o">}</span>
+        <span class="n">rateEvent</span>
+      <span class="o">}.</span><span class="n">cache</span><span 
class="o">()</span>
+
+    <span class="k">new</span> <span class="nc">TrainingData</span><span 
class="o">(</span>
+      <span class="n">users</span> <span class="k">=</span> <span 
class="n">usersRDD</span><span class="o">,</span>
+      <span class="n">items</span> <span class="k">=</span> <span 
class="n">itemsRDD</span><span class="o">,</span>
+      <span class="n">rateEvents</span> <span class="k">=</span> <span 
class="n">rateEventsRDD</span> <span class="c1">// MODIFIED
+</span>    <span class="o">)</span>
+
+</pre></td></tr></tbody></table> </div> <h3 id='preparator.scala' 
class='header-anchors'>Preparator.scala</h3><p>Modify Preparator to pass 
rateEvents to algorithm as PreparedData (Replace all <code>ViewEvent</code> 
with <code>RateEvent</code>. Replace all <code>viewEvent</code> with 
<code>rateEvent</code>)</p><p>Modify Preparator&#39;s <code>parpare()</code> 
method:</p><div class="highlight scala"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11</pre></td><td class="code"><pre>
+  <span class="o">...</span>
+
+  <span class="k">def</span> <span class="n">prepare</span><span 
class="o">(</span><span class="n">sc</span><span class="k">:</span> <span 
class="kt">SparkContext</span><span class="o">,</span> <span 
class="n">trainingData</span><span class="k">:</span> <span 
class="kt">TrainingData</span><span class="o">)</span><span class="k">:</span> 
<span class="kt">PreparedData</span> <span class="o">=</span> <span 
class="o">{</span>
+    <span class="k">new</span> <span class="nc">PreparedData</span><span 
class="o">(</span>
+      <span class="n">users</span> <span class="k">=</span> <span 
class="n">trainingData</span><span class="o">.</span><span 
class="n">users</span><span class="o">,</span>
+      <span class="n">items</span> <span class="k">=</span> <span 
class="n">trainingData</span><span class="o">.</span><span 
class="n">items</span><span class="o">,</span>
+      <span class="n">rateEvents</span> <span class="k">=</span> <span 
class="n">trainingData</span><span class="o">.</span><span 
class="n">rateEvents</span><span class="o">)</span> <span class="c1">// MODIFIED
+</span>  <span class="o">}</span>
+
+  <span class="o">...</span>
+</pre></td></tr></tbody></table> </div> <p>Modify <code>PreparedData</code> 
class:</p><div class="highlight scala"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
+2
+3
+4
+5
+6</pre></td><td class="code"><pre><span class="k">class</span> <span 
class="nc">PreparedData</span><span class="o">(</span>
+  <span class="k">val</span> <span class="n">users</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[(</span><span 
class="kt">String</span>, <span class="kt">User</span><span class="o">)],</span>
+  <span class="k">val</span> <span class="n">items</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[(</span><span 
class="kt">String</span>, <span class="kt">Item</span><span class="o">)],</span>
+  <span class="k">val</span> <span class="n">rateEvents</span><span 
class="k">:</span> <span class="kt">RDD</span><span class="o">[</span><span 
class="kt">RateEvent</span><span class="o">]</span> <span class="c1">// MODIFIED
+</span><span class="o">)</span> <span class="k">extends</span> <span 
class="nc">Serializable</span>
+
+</pre></td></tr></tbody></table> </div> <h3 id='ecommalgorithm.scala' 
class='header-anchors'>ECommAlgorithm.scala</h3><p>Modify <code>train()</code> 
method to train with rate event.</p><div class="highlight scala"><table 
style="border-spacing: 0"><tbody><tr><td class="gutter gl" style="text-align: 
right"><pre class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33</pre></td><td class="code"><pre>
+  <span class="k">def</span> <span class="n">train</span><span 
class="o">(</span><span class="n">sc</span><span class="k">:</span> <span 
class="kt">SparkContext</span><span class="o">,</span> <span 
class="n">data</span><span class="k">:</span> <span 
class="kt">PreparedData</span><span class="o">)</span><span class="k">:</span> 
<span class="kt">ALSModel</span> <span class="o">=</span> <span 
class="o">{</span>
+    <span class="n">require</span><span class="o">(!</span><span 
class="n">data</span><span class="o">.</span><span 
class="n">rateEvents</span><span class="o">.</span><span 
class="n">take</span><span class="o">(</span><span class="mi">1</span><span 
class="o">).</span><span class="n">isEmpty</span><span class="o">,</span> <span 
class="c1">// MODIFIED
+</span>      <span class="n">s</span><span class="s">"rateEvents in 
PreparedData cannot be empty."</span> <span class="o">+</span> <span 
class="c1">// MODIFIED
+</span>      <span class="s">" Please check if DataSource generates 
TrainingData"</span> <span class="o">+</span>
+      <span class="s">" and Preprator generates PreparedData 
correctly."</span><span class="o">)</span>
+
+    <span class="o">...</span>
+
+    <span class="k">val</span> <span class="n">mllibRatings</span> <span 
class="k">=</span> <span class="n">data</span><span class="o">.</span><span 
class="n">rateEvents</span> <span class="c1">// MODIFIED
+</span>      <span class="o">.</span><span class="n">map</span> <span 
class="o">{</span> <span class="n">r</span> <span class="k">=&gt;</span>
+        <span class="o">...</span>
+
+        <span class="o">((</span><span class="n">uindex</span><span 
class="o">,</span> <span class="n">iindex</span><span class="o">),</span> <span 
class="o">(</span><span class="n">r</span><span class="o">.</span><span 
class="n">rating</span><span class="o">,</span> <span class="n">r</span><span 
class="o">.</span><span class="n">t</span><span class="o">))</span> <span 
class="c1">// MODIFIED
+</span>      <span class="o">}.</span><span class="n">filter</span> <span 
class="o">{</span> <span class="k">case</span> <span class="o">((</span><span 
class="n">u</span><span class="o">,</span> <span class="n">i</span><span 
class="o">),</span> <span class="n">v</span><span class="o">)</span> <span 
class="k">=&gt;</span>
+        <span class="c1">// keep events with valid user and item index
+</span>        <span class="o">(</span><span class="n">u</span> <span 
class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span 
class="o">)</span> <span class="o">&amp;&amp;</span> <span 
class="o">(</span><span class="n">i</span> <span class="o">!=</span> <span 
class="o">-</span><span class="mi">1</span><span class="o">)</span>
+      <span class="o">}.</span><span class="n">reduceByKey</span> <span 
class="o">{</span> <span class="k">case</span> <span class="o">(</span><span 
class="n">v1</span><span class="o">,</span> <span class="n">v2</span><span 
class="o">)</span> <span class="k">=&gt;</span> <span class="c1">// MODIFIED
+</span>        <span class="c1">// if a user may rate same item with different 
value at different times,
+</span>        <span class="c1">// use the latest value for this case.
+</span>        <span class="c1">// Can remove this reduceByKey() if no need to 
support this case.
+</span>        <span class="k">val</span> <span class="o">(</span><span 
class="n">rating1</span><span class="o">,</span> <span class="n">t1</span><span 
class="o">)</span> <span class="k">=</span> <span class="n">v1</span>
+        <span class="k">val</span> <span class="o">(</span><span 
class="n">rating2</span><span class="o">,</span> <span class="n">t2</span><span 
class="o">)</span> <span class="k">=</span> <span class="n">v2</span>
+        <span class="c1">// keep the latest value
+</span>        <span class="k">if</span> <span class="o">(</span><span 
class="n">t1</span> <span class="o">&gt;</span> <span class="n">t2</span><span 
class="o">)</span> <span class="n">v1</span> <span class="k">else</span> <span 
class="n">v2</span>
+      <span class="o">}</span>
+      <span class="o">.</span><span class="n">map</span> <span 
class="o">{</span> <span class="k">case</span> <span class="o">((</span><span 
class="n">u</span><span class="o">,</span> <span class="n">i</span><span 
class="o">),</span> <span class="o">(</span><span class="n">rating</span><span 
class="o">,</span> <span class="n">t</span><span class="o">))</span> <span 
class="k">=&gt;</span> <span class="c1">// MODIFIED
+</span>        <span class="c1">// MLlibRating requires integer index for user 
and item
+</span>        <span class="nc">MLlibRating</span><span 
class="o">(</span><span class="n">u</span><span class="o">,</span> <span 
class="n">i</span><span class="o">,</span> <span class="n">rating</span><span 
class="o">)</span> <span class="c1">// MODIFIED
+</span>      <span class="o">}.</span><span class="n">cache</span><span 
class="o">()</span>
+
+    <span class="o">...</span>
+  <span class="o">}</span>
+</pre></td></tr></tbody></table> </div> <p>Modify <code>train()</code> method 
to use <code>ALS.trainImplicit()</code>:</p><p>Change the following 
from:</p><div class="highlight scala"><table style="border-spacing: 
0"><tbody><tr><td class="gutter gl" style="text-align: right"><pre 
class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12</pre></td><td class="code"><pre>    <span class="o">...</span>
+
+    <span class="k">val</span> <span class="n">m</span> <span 
class="k">=</span> <span class="nc">ALS</span><span class="o">.</span><span 
class="n">trainImplicit</span><span class="o">(</span>
+      <span class="n">ratings</span> <span class="k">=</span> <span 
class="n">mllibRatings</span><span class="o">,</span>
+      <span class="n">rank</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span class="n">rank</span><span 
class="o">,</span>
+      <span class="n">iterations</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span 
class="n">numIterations</span><span class="o">,</span>
+      <span class="n">lambda</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span class="n">lambda</span><span 
class="o">,</span>
+      <span class="n">blocks</span> <span class="k">=</span> <span 
class="o">-</span><span class="mi">1</span><span class="o">,</span>
+      <span class="n">alpha</span> <span class="k">=</span> <span 
class="mf">1.0</span><span class="o">,</span> <span class="c1">// WILL BE 
REMOVED
+</span>      <span class="n">seed</span> <span class="k">=</span> <span 
class="n">seed</span><span class="o">)</span>
+    <span class="o">...</span>
+
+</pre></td></tr></tbody></table> </div> <p>to:</p><div class="highlight 
scala"><table style="border-spacing: 0"><tbody><tr><td class="gutter gl" 
style="text-align: right"><pre class="lineno">1
+2
+3
+4
+5
+6
+7
+8
+9
+10</pre></td><td class="code"><pre>    <span class="o">...</span>
+    <span class="k">val</span> <span class="n">m</span> <span 
class="k">=</span> <span class="nc">ALS</span><span class="o">.</span><span 
class="n">train</span><span class="o">(</span> <span class="c1">// MODIFIED
+</span>      <span class="n">ratings</span> <span class="k">=</span> <span 
class="n">mllibRatings</span><span class="o">,</span>
+      <span class="n">rank</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span class="n">rank</span><span 
class="o">,</span>
+      <span class="n">iterations</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span 
class="n">numIterations</span><span class="o">,</span>
+      <span class="n">lambda</span> <span class="k">=</span> <span 
class="n">ap</span><span class="o">.</span><span class="n">lambda</span><span 
class="o">,</span>
+      <span class="n">blocks</span> <span class="k">=</span> <span 
class="o">-</span><span class="mi">1</span><span class="o">,</span>
+      <span class="n">seed</span> <span class="k">=</span> <span 
class="n">seed</span><span class="o">)</span>
+
+    <span class="o">...</span>
+</pre></td></tr></tbody></table> </div> <p>That&#39;s it! Now your engine can 
train model with rate events.</p></div></div></div></div><footer><div 
class="container"><div class="seperator"></div><div class="row"><div 
class="col-md-6 col-xs-6 footer-link-column"><div 
class="footer-link-column-row"><h4>Community</h4><ul><li><a 
href="//docs.prediction.io/install/" target="blank">Download</a></li><li><a 
href="//docs.prediction.io/" target="blank">Docs</a></li><li><a 
href="//github.com/apache/incubator-predictionio" 
target="blank">GitHub</a></li><li><a 
href="mailto:[email protected]"; 
target="blank">Subscribe to User Mailing List</a></li><li><a 
href="//stackoverflow.com/questions/tagged/predictionio" 
target="blank">Stackoverflow</a></li></ul></div></div><div class="col-md-6 
col-xs-6 footer-link-column"><div 
class="footer-link-column-row"><h4>Contribute</h4><ul><li><a 
href="//predictionio.incubator.apache.org/community/contribute-code/" 
target="blank">Contrib
 ute</a></li><li><a href="//github.com/apache/incubator-predictionio" 
target="blank">Source Code</a></li><li><a 
href="//issues.apache.org/jira/browse/PIO" target="blank">Bug 
Tracker</a></li><li><a 
href="mailto:[email protected]"; 
target="blank">Subscribe to Development Mailing 
List</a></li></ul></div></div></div></div><div id="footer-bottom"><div 
class="container"><div class="row"><div class="col-md-12"><div 
id="footer-logo-wrapper"><img alt="PredictionIO" 
src="/images/logos/logo-white-d1e9c6e6.png"/></div><div 
id="social-icons-wrapper"><a class="github-button" 
href="https://github.com/apache/incubator-predictionio"; data-style="mega" 
data-count-href="/apache/incubator-predictionio/stargazers" 
data-count-api="/repos/apache/incubator-predictionio#stargazers_count" 
data-count-aria-label="# stargazers on GitHub" aria-label="Star 
apache/incubator-predictionio on GitHub">Star</a> <a class="github-button" 
href="https://github.com/apache/incubator-predictionio/fo
 rk" data-icon="octicon-git-branch" data-style="mega" 
data-count-href="/apache/incubator-predictionio/network" 
data-count-api="/repos/apache/incubator-predictionio#forks_count" 
data-count-aria-label="# forks on GitHub" aria-label="Fork 
apache/incubator-predictionio on GitHub">Fork</a> <script id="github-bjs" 
async="" defer="" src="https://buttons.github.io/buttons.js";></script><a 
href="//www.facebook.com/predictionio" target="blank"><img alt="PredictionIO on 
Twitter" src="/images/icons/twitter-ea9dc152.png"/></a> <a 
href="//twitter.com/predictionio" target="blank"><img alt="PredictionIO on 
Facebook" src="/images/icons/facebook-5c57939c.png"/></a> 
</div></div></div></div></div></footer></div><script>(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
+(w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
+e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
+})(window,document,'script','//s.swiftypecdn.com/install/v1/st.js','_st');
+
+_st('install','HaUfpXXV87xoB_zzCQ45');</script><script 
src="/javascripts/application-f819cf19.js"></script></body></html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/5b520d3f/templates/ecommercerecommendation/train-with-rate-event/index.html.gz
----------------------------------------------------------------------
diff --git 
a/templates/ecommercerecommendation/train-with-rate-event/index.html.gz 
b/templates/ecommercerecommendation/train-with-rate-event/index.html.gz
new file mode 100644
index 0000000..a1f00f5
Binary files /dev/null and 
b/templates/ecommercerecommendation/train-with-rate-event/index.html.gz differ

Reply via email to