predictionio-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From don...@apache.org
Subject [09/51] [abbrv] [partial] incubator-predictionio-site git commit: Documentation based on apache/incubator-predictionio#5335b31dd95c72be5cc4a60f0756a978d1b2d908
Date Sun, 25 Dec 2016 21:17:22 GMT
http://git-wip-us.apache.org/repos/asf/incubator-predictionio-site/blob/c811983d/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..89aaea0
--- /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-a2a2f408.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:user-subscribe@predictionio.incubator.apache.org"
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:dev-subscribe@predictionio.incubator.apache.org"
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/c811983d/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..fd02fea
Binary files /dev/null and b/templates/ecommercerecommendation/train-with-rate-event/index.html.gz
differ


Mime
View raw message